@vladimir 
В Symfony 4 есть несколько способов организации роутинга из базы данных, но я опишу наиболее распространенный подход:
1 2 3 4 5 6  | 
services: AppProviderDatabaseRouteProvider: arguments: - '@AppServiceDatabaseRouteLoader' tags: - { name: 'routing.route_provider' }  | 
Это пример конфигурации, которая регистрирует провайдер маршрутов AppProviderDatabaseRouteProvider с аргументом AppServiceDatabaseRouteLoader и тегом routing.route_provider.
Обратите внимание, что этот подход может привести к дополнительным запросам к базе данных при каждом запросе к вашему приложению, что может ухудшить производительность. Поэтому рекомендуется кэшировать маршруты, чтобы избежать лишних запросов к базе данных.
@vladimir 
Для более конкретного примера, давайте предположим, что у нас есть сущность Route:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36  | 
// src/Entity/Route.php
namespace AppEntity;
use DoctrineORMMapping as ORM;
/**
 * @ORMEntity
 * @ORMTable(name="routes")
 */
class Route
{
    /**
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     * @ORMColumn(type="integer")
     */
    private $id;
    /**
     * @ORMColumn(type="string", length=255)
     */
    private $url;
    /**
     * @ORMColumn(type="string", length=255)
     */
    private $controller;
    /**
     * @ORMColumn(type="string", length=255)
     */
    private $method;
    // Геттеры и сеттеры
}
 | 
Затем создадим репозиторий для этой сущности:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  | 
// src/Repository/RouteRepository.php
namespace AppRepository;
use AppEntityRoute;
use DoctrineBundleDoctrineBundleRepositoryServiceEntityRepository;
use DoctrinePersistenceManagerRegistry;
class RouteRepository extends ServiceEntityRepository
{
    public function __construct(ManagerRegistry $registry)
    {
        parent::__construct($registry, Route::class);
    }
    public function findAllRoutes()
    {
        return $this->findAll();
    }
}
 | 
Далее создадим сервис и провайдер маршрутов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  | 
// src/Service/DatabaseRouteLoader.php
namespace AppService;
use AppRepositoryRouteRepository;
class DatabaseRouteLoader
{
    private $routeRepository;
    public function __construct(RouteRepository $routeRepository)
    {
        $this->routeRepository = $routeRepository;
    }
    public function loadRoutes()
    {
        return $this->routeRepository->findAllRoutes();
    }
}
 | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27  | 
// src/Provider/DatabaseRouteProvider.php
namespace AppProvider;
use SymfonyComponentRoutingRouteCollection;
use SymfonyComponentRoutingRoute;
class DatabaseRouteProvider implements RouteProviderInterface
{
    private $databaseRouteLoader;
    public function __construct(DatabaseRouteLoader $databaseRouteLoader)
    {
        $this->databaseRouteLoader = $databaseRouteLoader;
    }
    public function getRouteCollection()
    {
        $routes = new RouteCollection();
        foreach ($this->databaseRouteLoader->loadRoutes() as $route) {
            $routes->add($route->getUrl(), new Route($route->getController(), array('method' => $route->getMethod())));
        }
        return $routes;
    }
}
 | 
Наконец, зарегистрируем провайдер маршрутов в services.yaml:
1 2 3 4 5 6 7 8 9 10  | 
services:
    AppServiceDatabaseRouteLoader: 
        arguments:
            - '@AppRepositoryRouteRepository'
    AppProviderDatabaseRouteProvider:
        arguments:
            - '@AppServiceDatabaseRouteLoader'
        tags:
            - { name: 'routing.route_provider' }
 | 
Теперь маршруты из базы данных будут доступны в вашем Symfony 4 приложении. Не забудьте следовать совету о кэшировании маршрутов для улучшения производительности.