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

21
demandé sur Leon Radley 2011-10-04 16:04:36

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!

49
répondu Leon Radley 2014-06-05 02:03:21

Peut-être que vous pouvez essayer cela dans votre action ? : $this->container->get('templating')->addGlobal($nom, $valeur)

2
répondu benjaming 2011-10-04 17:13:05