Как организовать роутинг из базы данных в symfony 4?

Пользователь

от vladimir , в категории: PHP , 2 года назад

Как организовать роутинг из базы данных в symfony 4?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от jedidiah.brown , 2 года назад

@vladimir 

В Symfony 4 есть несколько способов организации роутинга из базы данных, но я опишу наиболее распространенный подход:

  1. Создайте сущность (Entity) для хранения маршрутов в базе данных. Например, вы можете создать класс Route, который содержит поля для URL-адреса, имени контроллера, имени метода и т.д.
  2. Создайте репозиторий (Repository) для этой сущности, который будет выполнять запросы к базе данных для извлечения маршрутов. Вы можете использовать Doctrine ORM для этого.
  3. Создайте сервис (Service), который будет использовать репозиторий для получения маршрутов из базы данных. Например, вы можете создать класс DatabaseRouteLoader, который будет содержать метод loadRoutes(), который будет использовать репозиторий для извлечения маршрутов.
  4. Создайте провайдер маршрутов (Route Provider), который будет использовать сервис DatabaseRouteLoader для получения маршрутов из базы данных и добавления их в систему маршрутизации Symfony. Например, вы можете создать класс DatabaseRouteProvider, который будет реализовывать интерфейс RouteProviderInterface.
  5. Зарегистрируйте провайдер маршрутов в вашем приложении Symfony. Вы можете сделать это в файле services.yaml, добавив соответствующую конфигурацию. Например:
1
2
3
4
5
6
services:
    AppProviderDatabaseRouteProvider:
        arguments:
            - '@AppServiceDatabaseRouteLoader'
        tags:
            - { name: 'routing.route_provider' }


Это пример конфигурации, которая регистрирует провайдер маршрутов AppProviderDatabaseRouteProvider с аргументом AppServiceDatabaseRouteLoader и тегом routing.route_provider.

  1. Теперь маршруты из базы данных должны быть доступны в вашем приложении Symfony.


Обратите внимание, что этот подход может привести к дополнительным запросам к базе данных при каждом запросе к вашему приложению, что может ухудшить производительность. Поэтому рекомендуется кэшировать маршруты, чтобы избежать лишних запросов к базе данных.

Пользователь

от mona_terry , 4 месяца назад

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