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