Мне нужно вернуть данные по умолчанию во всех действиях в моем проекте Symfony. Например, форма поиска в боковой панели, счетчик зрителей и т.д....
Поэтому мне нужно вернуть некоторые данные по умолчанию во всех действиях
return array(
'form' => $form->createView(),
'short_search' => $shortSearch->createView(),
);
Я нашел Добавить данные для возврата всех действий в решении контроллера Symfony, но это не удается, когда я использую аннотацию @Template
.
Конечно, я могу вызывать функцию render
из ветки, но кажется, что это не быстро и хорошая идея.
Какой компонент я должен переопределить в этом случае???
В разделе " Контроллеры " документа 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. (В качестве бонуса вы получите небольшое повышение производительности, особенно если вы полностью отключите аннотации, потому что у вас не будет накладных расходов на вызов этих прослушивателей событий по каждому запросу.)