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 }}
Czy istnieje sposób na udostępnienie usługi ze wszystkich widoków, takich jak sesja {{ app.session }}
?
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!
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)
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