@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 приложении. Не забудьте следовать совету о кэшировании маршрутов для улучшения производительности.