web-dev-qa-db-fra.com

Comment accédez-vous à une session d'utilisateurs à partir d'un service dans Symfony2?

Quelqu'un sait-il comment accéder à la variable de session dans un service?

J'ai une configuration de service à laquelle je passe le conteneur. Je peux accéder à des choses comme le service Doctrine en utilisant:

// Get the doctrine service
$doctrine_service = $this->container->get('doctrine');  
// Get the entity manager
$em = $doctrine_service->getEntityManager();

Cependant, je ne sais pas comment accéder à la session.

Dans un contrôleur, la session est accessible en utilisant:

$session = $this->getRequest()->getSession();
$session->set('foo', 'bar');
$foo = $session->get('foo');

La session fait-elle partie d'un service et, dans l'affirmative, quel est le service appelé?.

Toute aide sera grandement appréciée.

33
Adam Stacey

php app/console container:debug Montre que le service session est une instance de classe de Symfony\Component\HttpFoundation\Session, Vous devriez donc pouvoir récupérer la session avec ce nom:

$session = $this->container->get('session');

Après avoir effectué votre travail sur la session, appelez $session->save(); pour tout réécrire dans la session. Par ailleurs, il existe également deux autres services liés à la session qui s'affichent dans mon vidage de conteneur:

session.storage Instanceof Symfony\Component\HttpFoundation\SessionStorage\NativeSessionStorage

session_listener Instanceof Symfony\Bundle\FrameworkBundle\EventListener\SessionListener

26
Problematic

Si vous ne voulez pas passer dans le conteneur entier, vous passez simplement @session dans les arguments:

services.yml

my.service:
    class: MyApp\Service
    arguments: ['@session']

Service.php

use Symfony\Component\HttpFoundation\Session\Session;

class Service
{

    private $session;

    public function __construct(Session $session)
    {
        $this->session = $session;
    }

    public function someService()
    {
        $sessionVar = $this->session->get('session_var');
    }

}
55
greg

Essayez cette solution:

use Symfony\Component\HttpFoundation\Session\Session;

$session = new Session();
$session->get('variable');
2
Nerjuz

Dans Symfony 4, si vos services sont configurés pour le câblage automatique, vous n'avez pas besoin d'injecter la session manuellement via services.yaml plus longtemps.

Au lieu de cela, vous injecteriez simplement l'interface de session:

use Symfony\Component\HttpFoundation\Session\SessionInterface;

class SessionService
{
    private $session;

    public function __construct(
        SessionInterface $session
    )
    {
        $this->session = $session;
    }
}
1
Bananaapple