У меня есть большое приложение, использующее SF 3.4, и мне нужно найти лучший способ выполнения пользовательского рендеринга на основе пользователей при каждой загрузке страницы.
Прямо сейчас у нас есть слушатели для бокового меню, нижнего колонтитула, избранного бокового меню, меню приложений и независимо от того, истек ли ваш тайм-аут. Эти слушатели запускают событие темы через функцию рендеринга, которая добавляет информацию, относящуюся к доступу пользователей/избранному/если время ожидания истекло. Это невозможно сделать с ролями в twig, потому что у нас есть такие вещи, как избранное в меню, которые постоянно меняются.
Мы переопределяем метод рендеринга Controller для отправки этого события темы и array_merge того, что мы получаем обратно с массивом параметров функции рендеринга следующим образом:
protected function render($view, array $parameters = array(), Response $response = null)
{
$themeEvent = new ExampleThemeEvent($this->getUser(), $this->getMyMenuApplication());
$result = $this->getDispatcher()->dispatch(ExampleThemeEvent::NAME, $themeEvent);
$parameters = array_merge($result->getModel(),$parameters);
return parent::render($view, $parameters, $response);
}
Из-за этого большинство наших контроллеров расширяют ExampleThemeController, а не просто Controller, поэтому каждая страница, которую мы хотим иметь, имеет эти функции.
Это работает нормально, но метод рендеринга помечен как окончательный в SF 3.4, и его не следует переопределять. Как лучше всего подойти к этому, не переопределяя метод рендеринга? Есть ли другое место, куда я могу отправить событие нашей темы?
Мы пытались использовать подписчиков/слушателей onKernelController безрезультатно, потому что нам нужно добавить в контейнер дополнительные параметры представления, что невозможно сделать в данный момент.
Спасибо!