В моем приложении symfony2 у меня есть метод getPorfolioUser, который возвращает определенную пользовательскую переменную.
Я с нетерпением жду возможности позвонить
{% if portfolio_user%}
в веточке. Я не понимал, как я могу установить это как глобальную переменную, так как из документации, которую я под впечатлением, я могу установить только фиксированные элементы или службы, но не методы служб.
Должен ли я написать продление или помощник для этого? Какой простой способ сделать это?
Благодаря!
Вы можете определить свою настраиваемую службу в качестве twig globals variable
как показано ниже:
# Twig Configuration twig: debug: "%kernel.debug%" strict_variables: "%kernel.debug%" globals: myGlobaService: "@acme.demo_portfolio_service" #The id of your service
{% if myGlobaService.portfolio_user() %}
Надеюсь, что эта помощь
Один из подходов – прослушиватель событий CONTROLLER. Мне нравится использовать CONTROLLER вместо REQUEST, потому что он гарантирует, что все слушатели обычного запроса уже сделали свое дело.
use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\FilterControllerEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class ProjectEventListener implements EventSubscriberInterface { public static function getSubscribedEvents() { return array ( KernelEvents::CONTROLLER => array( array('onControllerProject'), ), ); } private $twig; public function __construct($twig) { $this->twig = $twig; } public function onControllerProject(FilterControllerEvent $event) { // Generate your data $project = ...; // Twig global $this->twig->addGlobal('project',$project); } # services.yml cerad_project__project_event_listener: class: ...\ProjectEventListener tags: - { name: kernel.event_subscriber } arguments: - '@twig'
Слушатели описаны здесь: http://symfony.com/doc/current/cookbook/service_container/event_listener.html
Другой подход состоял бы в том, чтобы избежать твиновской глобальной целиком и просто сделать вызов расширения твиг. http://symfony.com/doc/current/cookbook/templating/twig_extension.html
В любом случае работает хорошо.
Когда вы смотрите здесь: http://symfony.com/doc/current/reference/twig_reference.html#app
Вы можете прочитать следующее:
Переменная приложения доступна повсюду и предоставляет доступ ко многим обычно требуемым объектам и значениям. Это экземпляр GlobalVariables.
GlobalVariables
– это Symfony\Bundle\FrameworkBundle\Templating\GlobalVariables
Я никогда не делаю этого, но я думаю, что один из способов – переоценить этот класс, чтобы вложить ваши особые потребности.
Мне тоже было сложно с этим справиться и, наконец, решить его, сделав следующее:
Настройте свой пакет (например: MyVendor / MyBundle)
$ app/console generate:bundle
В этом файле класса создайте функцию
public function getExample(){ return "it works!!!"; }
В app / config / services.yml создайте новый сервис:
myvendor.mybundle.myservice class: MyVendor\MyBundle\DependencyInjection\MyService
В app / config / config.yml в разделе конфигурации ветки
twig: globals: mystuff: '@myvendor.mybundle.myservice'
Затем в ваших шаблонах вы можете ссылаться на переменную следующим образом:
{{ mystuff.example }}
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ
это именно то, как я получил его на работу ….
надеюсь это поможет.