Решение
Создав пользовательский сервис, я могу добраться до него из любого места, используя
$this->get('myservice');
. Все это делается с помощью http://symfony.com/doc/current/book/service_container.html
НоЯ дам вам некоторый демонстрационный код.
Служба
Этот первый фрагмент является действительным обслуживанием
<?php
namespace MyBundle\AppBundle\Extensions;
use Symfony\Component\HttpFoundation\Session;
use Doctrine\ORM\EntityManager;
use MyBundle\AppBundle\Entity\Patient;
class AppState
{
protected $session;
protected $em;
function __construct(Session $session, EntityManager $em)
{
$this->session = $session;
$this->em = $em;
}
public function getPatient()
{
$id = $this->session->get('patient');
return isset($id) ? $em->getRepository('MyBundleStoreBundle:Patient')->find($id) : null;
}
}
Зарегистрируйте его в вас config.yml
примерно так:
services:
appstate:
class: MyBundle\AppBundle\Extensions\AppState
arguments: [@session, @doctrine.orm.entity_manager]
Теперь мы можем, как я уже говорил, получить сервис в наших контроллерах с помощью
$this->get('myservice');
Но так как это глобальный сервис, я не хотел этого делатьв каждом контроллере и каждом действии
public function myAction()
{
$appstate = $this->get('appstate');
return array(
'appstate' => $appstate
);
}
, поэтому теперь мы создадим расширение Twig_Extension
Twig
<?php
namespace MyBundle\AppBundle\Extensions;
use MyBundle\AppBundle\Extensions\AppState;
class AppStateExtension extends \Twig_Extension
{
protected $appState;
function __construct(AppState $appState) {
$this->appState = $appState;
}
public function getGlobals() {
return array(
'appstate' => $this->appState
);
}
public function getName()
{
return 'appstate';
}
}
Используя инъекцию зависимостей, у нас теперь есть служба AppState, котораямы создали в расширении ветки с именем appstate
Теперь мы регистрируем это с помощью Symfony (снова внутри раздела services
внутри файла конфигурации)
twig.extension.appstate:
class: MyBundle\AppBundle\Extensions\AppStateExtension
arguments: [@appstate]
tags:
- { name: twig.extension }
Важной частью является "теги ", так как это то, что Symfony использует, чтобы найти все расширения ветки
Теперь мы настроены на использование нашего appstate в наших шаблонах веток с именем переменной
{{ appstate.patient }}
или
{{ appstate.getPatient() }}
Awesome!