Symfony 4 маршрутизация из БД - PullRequest
0 голосов
/ 03 июня 2018

Я создаю простую CMS с Symfony 4. Где можно создавать страницы.При создании страницы вызывается Doctrine EvenSubscriber.Этот подписчик создает PageRoute .

<?php
#src/Doctrine/EvenListener 

/**
 * PageRouteSubscriber
 */

namespace App\Doctrine\EventListener;


use App\Controller\PageController;
use App\Entity\Page;
use App\Entity\Route;
use Doctrine\Common\EventSubscriber;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;

/**
 * Class PageRouteSubscriber
 * @package App\Doctrine\EventListener
 */
class PageRouteSubscriber implements EventSubscriber {
    /**
     * Returns an array of events this subscriber wants to listen to.
     * @return array
     */
    public function getSubscribedEvents() {
        return [
            'postPersist',
            'postUpdate',
        ];
    }

    public function postPersist(LifecycleEventArgs $args){
        $this->index($args);
    }

    public function postUpdate(LifecycleEventArgs $args){
        $this->index($args);
    }

    public function index(LifecycleEventArgs $args)
    {
        $entity = $args->getObject();
        if($entity instanceof Page){
            $route = new Route();
            $route->setController(PageController::class);
            $route->setRouteContentId(get_class($entity) . '#' . $entity->getId());
            $route->setLocale($entity->getLocale());
            $route->setSlug($entity->getSlug());

            $entityManager = $args->getObjectManager();
            $entityManager->persist($route);
            $entityManager->flush();
        }
    }
}

. Таким образом, при создании страницы также создается маршрут.См. Изображения для страницы базы данных и примеров маршрутов.

Страница Table page

Маршрут Table route

Я не знаю, что это лучший способ хранить маршруты и страницы в БД.Потому что у них обоих одинаковый слизень.Я думал, только установить слизняки в таблице маршрутов.И для каждой сущности, проверяющей уникальный слаг на основе всех слагов в таблице маршрутов (если это возможно?).

Для маршрутизации: я сейчас не знаю, как подбирать маршруты и использовать их с Symfony Route Collection.Также возможно кэшировать те маршруты так же, как это делает Symfony и создает в большом файле с именем: srcDevDebugProjectContainerUrlGenerator

Когда у меня есть работающие маршруты, я могу создать меню внешнего интерфейса.Где пункт меню страницы связан со страницей.Эта страница имеет маршрут.С помощью этого маршрута можно создать URL-адрес меню (это правильный способ мышления?).

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Решая что-то похожее в прошлом, в реальности нужно сделать несколько шагов.Мне нужно было иметь маршруты без префикса (поэтому не /article/{slug}, а просто {slug}, и у меня их довольно много, поэтому БД выглядит более подходящим.

  • Хранение маршрутов - у меня есть таблица маршрутовгде я хранил URL для сопоставления, целевой контроллер и параметры для передачи (я не смог включить ID в маршрут)
  • В вашем случае - Статья будет иметь route_id в качестве одного из своих свойств. Это также будетрешите генерацию маршрутов, потому что вы будете получать их из базы данных через ассоциацию
  • При создании нового маршрута я проверил, существует ли маршрут с запрошенным именем, если так, я добавил добавочный номер в конец.
  • Тогда у меня есть один общий маршрут в конце моих обычных маршрутов, чтобы соответствовать всем /*, я подключился к событиям ядра, и если этот маршрут был найден, и я нашел текущий запрос mu в моей базе данных - я изменил запрос, чтобы указать наконтроллер записей моей базы данных

Это можно легко расширить, например, для отслеживания истории изменений (скажем, выесть Article First Article (slug: /first-article), затем вы переименовываете ее во Second Article (slug Changed: /second-article), здесь вы можете легко отследить это изменение и сделать правильное перенаправление.

0 голосов
/ 04 июня 2018

Вам не нужно хранить маршруты в базе данных, взгляните на компоненты маршрутизатора CMF, вы можете использовать динамический маршрутизатор для маршрутизации любых страниц cms на основе слаг (https://symfony.com/doc/master/cmf/bundles/routing/dynamic.html),, затем использовать цепной маршрутизатор (https://symfony.com/doc/master/cmf/components/routing/chain.html), чтобы использовать его вместе со стандартным маршрутизатором SF.

0 голосов
/ 03 июня 2018

Я думаю, вам следует избегать хранения имен классов в вашей базе данных.Если вы измените свое пространство имен, они больше не будут работать.И я не понимаю, зачем вам таблица маршрутов?

Вы можете просто сделать это подобно тому, как это делают большинство CMS: просто используйте slug из вашей сущности страницы и позвольте symfony paramконвертер обработайте все остальное или загрузите его вручную.

/**
 * @Route("/page/{slug}")
 * @ParamConverter("page")
 */
public function showAction(Page $page)
{
}

Вы можете получить региональные URL-адреса корыта вот так .

для своего меню, вы можете простосоздайте сущность «меню» и добавьте отношение к вашей сущности страницы или зафиксируйте в ней поле слаг / URL.

...