Динамическая маршрутизация и шаблоны в symfony

#symfony #twig #symfony-routing

Вопрос:

Недавно, создавая свою CMS в Symfony, я столкнулся с проблемой. У меня есть 2 контроллера, publicationcontroller и contactcontroller . В обоих контроллерах экземпляр сущности Page загружается всякий раз, когда совпадает соответствующий слиток. Ниже приведен код:

 class ContactController extends AbstractController
{
    /**
     * @Route("/{slug}", name="contact")
     */
    public function index(PageRetriever $pageRetriever, $slug)
    {
        $page = $pageRetriever->getPage($slug);

        return $this->render('contact/index.html.twig', [
            'page' => $page
        ]);
    }
}

class PublicationController extends AbstractController
{
    /**
     * @Route("/{slug}", name="publications")
     */
    public function index(PageRetriever $pageRetriever, $slug)
    {
        $page = $pageRetriever->getPage($slug);

        return $this->render('publication/index.html.twig', [
            'page' => $page
        ]);
    }
}
 

Моя проблема в том, что и содержимое публикации, и контакт загружаются в один и тот же шаблон, в зависимости от того, какой контроллер инициализируется первым.

У кого-нибудь здесь есть идея или несколько советов о том, как загрузить правильный шаблон, в зависимости от того, какой слизень называется?

Любая надежда очень ценится

Ответ №1:

Symfony никак не может знать, какой контроллер следует вызывать. У вас один и тот же маршрут для обоих contact и publication контроллера.

Есть 2 возможных решения, которые я могу придумать.

1. Используйте разные маршруты

 @Route("/publication/{slug}", name="publications")
@Route("/contact/{slug}", name="contact")
 

2. Используйте один контроллер, но напишите свою собственную логику для выбора шаблона

 $page = $pageRetriever->getPage($slug);

if ($page->getType() === 'publication') {
    return $this->render('publication/index.html.twig', [
        'page' => $page
    ]);
}

return $this->render('contact/index.html.twig', [
    'page' => $page
]);
 

Комментарии:

1. Я думаю, что вариант 2-это хороший первый шаг. Я постараюсь визуализировать шаблоны из подобной службы и постараюсь предоставить им собственные контроллеры