Добавьте возврат данных во все действия с аннотацией @Template

1

Мне нужно вернуть данные по умолчанию во всех действиях в моем проекте Symfony. Например, форма поиска в боковой панели, счетчик зрителей и т.д....

Поэтому мне нужно вернуть некоторые данные по умолчанию во всех действиях

return array(
    'form' => $form->createView(),
    'short_search' => $shortSearch->createView(),
);

Я нашел Добавить данные для возврата всех действий в решении контроллера Symfony, но это не удается, когда я использую аннотацию @Template.

Конечно, я могу вызывать функцию render из ветки, но кажется, что это не быстро и хорошая идея.

Какой компонент я должен переопределить в этом случае???

  • 0
    И вы будете включать в каждый шаблон контроллера боковую панель или устанавливать данные в базовый шаблон, это лучше? Я так не думаю.
Теги:
annotations

1 ответ

1
Лучший ответ

В разделе " Контроллеры " документа Symfony Best Practices рекомендуется @Template() аннотации @Template(), поэтому легко исправить вашу проблему было бы просто не использовать @Template().

Причина, отменяющая метод рендеринга базового контроллера, не работает, потому что вы на самом деле не вызываете ее, и ни одна из них не является основой. Вместо этого, аннотация SensioFrameworkExtraBundle @Template работает, установив прослушиватель событий для KernelEvents::VIEW (kernel.view) и (после использования другого события, чтобы угадать имя шаблона, если необходимо), напрямую использует службу шаблонов для отображения ответа,


В общем случае вместо этого вы можете установить прослушиватель событий на kernel.view с более высоким приоритетом и использовать событие GetResponseForControllerResultEvent для добавления в ваши параметры. Этот прослушиватель событий может выглядеть примерно так:

use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;

public function onKernelView(GetResponseForControllerResultEvent $event)
{
    $parameters = $event->getControllerResult();

    //modify parameters

    $event->setControllerResult($parameters);
}

с любыми услугами, необходимыми для получения дополнительных параметров, передаваемых через инъекцию зависимостей. Вы также можете посмотреть реализацию для @Template TemplateListener для справки.

В Поварной книге Symfony есть дополнительная информация о том, как настроить прослушиватели событий.


В вашем конкретном случае вы, вероятно, будете генерировать вашу $form и $shortSearch целиком из этого обработчика событий, поэтому, по крайней мере, вашему обработчику событий потребуется хотя бы служба формы.


На мой взгляд, все это в значительной степени больше проблем, чем стоит, и было бы лучше просто удалить аннотацию @Template. (В качестве бонуса вы получите небольшое повышение производительности, особенно если вы полностью отключите аннотации, потому что у вас не будет накладных расходов на вызов этих прослушивателей событий по каждому запросу.)

  • 0
    Большое спасибо за такой сложный и масштабный ответ. Я буду читать раздел Best Practices.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню