Symfony 2.0.3 variable globale de modèle
J'ai une entité que je veux associer à la session des utilisateurs. J'ai créé un service afin que je puisse atteindre cette information d'où que ce soit.
Dans le service, j'enregistre l'ID des entités dans une variable de session
et dans la méthode getEntity()
, j'obtiens la variable de session et avec doctrine trouve l'entité et la renvoie.
De cette façon au modèle, je devrais être capable d'appeler {{ myservice.myentity.myproperty }}
Le problème est que myservice est utilisé partout, et je ne veux pas avoir à le faire dans tous les depuis L'Action et l'ajouter au tableau de vue.
Existe-t-il un moyen de rendre un service accessible depuis toutes les vues comme la session {{ app.session }}
?
2 réponses
La solution
En créant un service personnalisé, je peux y arriver d'où que ce soit en utilisant
$this->get('myservice');
Cela est fait par http://symfony.com/doc/current/book/service_container.html
Mais je vais vous donner un code de démonstration.
Le Service
Ce premier extrait est le service réel
<?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;
}
}
Enregistrez-le en vous config.yml
avec quelque chose comme ça
services:
appstate:
class: MyBundle\AppBundle\Extensions\AppState
arguments: [@session, @doctrine.orm.entity_manager]
Maintenant, nous pouvons, comme je l'ai déjà dit, obtenir le service dans nos contrôleurs avec
$this->get('myservice');
Mais comme il s'agit d'un service global, Je ne voulais pas avoir à le faire dans chaque contrôleur et chaque action
public function myAction()
{
$appstate = $this->get('appstate');
return array(
'appstate' => $appstate
);
}
Alors maintenant, nous allons créer un Twig_Extension
Extension De Brindille
<?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';
}
}
En utilisant l'injection de dépendance, nous avons maintenant le service AppState que nous avons créé dans l'extension twig nommée appstate
Maintenant, nous enregistrons cela avec le symfony (encore une fois dans la section services
à l'intérieur du fichier de configuration)
twig.extension.appstate:
class: MyBundle\AppBundle\Extensions\AppStateExtension
arguments: [@appstate]
tags:
- { name: twig.extension }
La partie importante étant les "tags", puisque c'est ce que symfony utilise pour trouver toutes les extensions de brindilles
Nous sommes maintenant configurés pour utiliser notre appstate dans nos modèles de brindilles par le nom de variable
{{ appstate.patient }}
Ou
{{ appstate.getPatient() }}
Génial!
Peut-être que vous pouvez essayer cela dans votre action ? : $this->container->get('templating')->addGlobal($nom, $valeur)