如何从Symfony2中的服务访问用户会话?

时间:2011-08-25 15:17:34

标签: php symfony

有谁知道如何访问服务中的会话变量?

我有一个服务设置,我将容器传递给。我可以使用:

访问Doctrine服务之类的东西
// Get the doctrine service
$doctrine_service = $this->container->get('doctrine');  
// Get the entity manager
$em = $doctrine_service->getEntityManager();

但是,我不确定如何访问会话。

在控制器中,可以使用以下方式访问会话:

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

会话是服务的一部分,如果是,那么所谓的服务是什么。

任何帮助都会非常感激。

5 个答案:

答案 0 :(得分:54)

如果您不想传递整个容器,只需在参数中传入@session:

<强> 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');
    }

}

答案 1 :(得分:26)

php app/console container:debug显示session服务是Symfony\Component\HttpFoundation\Session的类实例,因此您应该能够检索具有该名称的会话:

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

完成会话后的工作后,请致电$session->save();将所有内容写回会话。顺便提一下,我的容器转储中还有两个与会话相关的服务:

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

session_listener instanceof Symfony\Bundle\FrameworkBundle\EventListener\SessionListener

答案 2 :(得分:2)

试试这个解决方案:

use Symfony\Component\HttpFoundation\Session\Session;

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

答案 3 :(得分:2)

在Symfony 4中,如果您已将服务配置为自动连线,则不再需要通过services.yaml手动注入会话。

相反,您只需注入会话接口即可:

use Symfony\Component\HttpFoundation\Session\SessionInterface;

class SessionService
{
    private $session;

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

答案 4 :(得分:-2)

faz assim que vai funcionar

use Symfony\Component\HttpFoundation\Session\Session;

class ClassType extends AbstractType {
    private $session;

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {

        $this->session = new Session();

    ->add('field', $this->session->get('nameFieldSession'));

    }

}