Глобальные значения: Определить как службу или определить абстрактный класс контроллера?

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

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

Примечание. На самом деле это не статическое значение, которое одинаково для всех пользователей, но это значение для пользователя, которое отличается для каждого пользователя.

3 ответа

Если эти переменные используются для отображения одного и того же места на вашей странице, вы можете отобразить встроенный контроллер. Как это:

<div id="sidebar">
 {{ render(controller('YourBundle:User:stats')) }}
</div>

Это добавит весь вывод YourBundle/UserController/statsAction в div #sidebar. Внутри этого действия вы можете извлечь всю информацию, которая вам нужна.

Если вам нужно использовать эти переменные другим способом, возможно, вам следует посмотреть ответное событие.


Вы знакомы с слушателями событий? http://symfony.com/doc/current/cookbook/service_container/event_listener.html

Слушатель событий может использоваться для инъекции глобальных глобулов.

class ModelEventListener extends ContainerAware implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
 return array(
 KernelEvents::CONTROLLER => array(
 array('doProject', -1300),
 ),
 KernelEvents::VIEW => array(
 array('doView', -2100),
 ),
 );
}
public function doProject(FilterControllerEvent $event)
{
 $project = $whatever_is_needed_to_find_the_project();

 if (!$project) throw new NotFoundHttpException('Project not found ' . $projectSearch);

 // Add to request
 $event->getRequest()->attributes->set('project',$project);

 // Give all twig templates access to project
 $twig = $this->container->get('twig');
 $twig->addGlobal('project',$project);
}
# services.yml
cerad_core__model__event_listener:
 class: '%cerad_core__model__event_listener__class%'
 calls:
 - [setContainer, ['@service_container']]
 tags:
 - { name: kernel.event_subscriber }


Если это значение пользователя, как вы сказали, вы можете получить app.user.XXX на каждом шаблоне ветки, который вам нужен, без обработки ничего;)

licensed under cc by-sa 3.0 with attribution.