Symfony 2.0.3 globalna zmienna szablonowa

Mam podmiot, który chcę powiązać z sesją użytkowników. Stworzyłem serwis, dzięki któremu mogłem dotrzeć do tych informacji skądinąd.

W usłudze zapisuję ID encji w zmiennej sesyjnej a w metodzie getEntity() dostaję zmienną session i z doctrine znajduję encję i zwracam ją.

W ten sposób do szablonu powinienem móc wywołać {{ myservice.myentity.myproperty }}

Problem w tym, że myservice jest używany wszędzie i nie chcę mieć go w każdym od akcji i dołączyć go do tablicy widoku.

Czy istnieje sposób na udostępnienie usługi ze wszystkich widoków, takich jak sesja {{ app.session }} ?

Author: Leon Radley, 2011-10-04

2 answers

Rozwiązanie

Tworząc niestandardową usługę mogę dostać się do tego skąd kiedykolwiek za pomocą

$this->get('myservice');

To wszystko jest zrobione przez http://symfony.com/doc/current/book/service_container.html

Ale dam ci trochę kodu demo.

Serwis

Ten pierwszy fragment jest faktycznym serwisem

<?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;
    }
}

Zarejestruj to w sobie config.yml z czymś takim

services:
    appstate:
        class: MyBundle\AppBundle\Extensions\AppState
        arguments: [@session, @doctrine.orm.entity_manager]

Teraz możemy, jak mówiłem wcześniej, uzyskać usługę w naszych kontrolerów z

$this->get('myservice');

Ale ponieważ jest to usługa globalna, nie chciałem tego robić w każdym kontrolerze i każdej akcji

public function myAction()
{
    $appstate = $this->get('appstate');
    return array(
        'appstate' => $appstate
    );
}

Więc teraz stwórzmy Twig_Extension

Rozszerzenie Gałązki

<?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';
    }

}

Używając dependency injection mamy teraz usługę AppState, którą stworzyliśmy w rozszerzeniu gałązki o nazwie appstate

Teraz rejestrujemy to za pomocą symfony (ponownie w sekcji services wewnątrz pliku konfiguracyjnego)

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

Ważna część jako" tagi", ponieważ to jest to, czego używa symfony, aby znaleźć wszystkie rozszerzenia twig

Teraz możemy używać naszego appstate w naszych szablonach gałązek o nazwie zmiennej

{{ appstate.patient }}

Lub

{{ appstate.getPatient() }}

Awesome!

 49
Author: Leon Radley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-05 02:03:21

Może spróbujesz tego w swoim działaniu ? : $this - > container->get('templating') - > addGlobal($name, $value)

 2
Author: benjaming,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-04 17:13:05