Подтвердить что ты не робот

Symfony 2.0.3 Глобальная переменная шаблона

У меня есть Entity, который я хочу связать с сеансом пользователей. Я создал службу, чтобы я мог получить эту информацию откуда-то.

в службе я сохраняю идентификатор объектов в переменной сеанса и в методе getEntity() я получаю переменную сеанса и с доктриной нахожу объект и возвращаю его.

таким образом к шаблону я должен быть в состоянии вызвать {{ myservice.myentity.myproperty }}

Проблема в том, что myservice используется повсеместно, и я не хочу, чтобы его можно было получить в каждом после Action и добавить в массив вида.

Есть ли способ сделать службу доступной из всех представлений, таких как сеанс {{ app.session }}?

4b9b3361

Ответ 1

Решение

Создав настраиваемую службу, я могу перейти к ней, используя когда-либо

$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 Service, которую мы создали в расширении ветки с именем appstate

Теперь мы регистрируем это с помощью symfony (снова внутри раздела services внутри конфигурационного файла)

twig.extension.appstate:
    class: MyBundle\AppBundle\Extensions\AppStateExtension
    arguments: [@appstate]
    tags:
        - { name: twig.extension }

Важной частью является "теги", так как это то, что Symfony использует для поиска всех расширений twig

Теперь мы настроены на использование нашего appstate в наших шаблонах twig с помощью имени переменной

{{ appstate.patient }}

или

{{ appstate.getPatient() }}

Awesome!

Ответ 2

Возможно, вы можете попробовать это в своих действиях?: $this- > container- > get ('templating') → addGlobal ($ name, $value)