【问题标题】:How do you access a users session from a service in Symfony2?您如何从 Symfony2 中的服务访问用户会话?
【发布时间】:2011-11-03 19:24:39
【问题描述】:

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

我有一个服务设置,我将容器传递给它。我可以通过以下方式访问 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');

会话是服务的一部分吗?如果是,服务的名称是什么。

任何帮助将不胜感激。

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    如果您不想传入整个容器,只需在参数中传入@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');
        }
    
    }
    

    【讨论】:

    • 您好!我是 SF2 的新手,我正在尝试弄清楚会话是如何工作的。你能告诉我如何使用此服务在控制器中设置或获取会话吗?
    • 您好,您可以从控制器访问整个“服务容器”。因此,要获得会话,您可以使用$session = $this->container->get('session'); 同样,您可以通过相同的方式获得任何其他服务。
    • 当你只写过原始的 PHP 程序时,从 Symfony 开始是很棘手的。我强烈建议您找到一个很好的教程,从头到尾构建一个基本的应用程序并完成它,它会让您更好地了解做什么以及如何构建您的应用程序。
    • 太好了,我是一名 Laravel 开发人员,两个月前开始使用 symfony 时,情况大不相同.. 更“复杂”,但感谢您的建议!
    • 这是执行 OP 要求的更好方法。与其直接尝试从服务中访问会话对象,不如将其注入服务中。我就是这样做的。
    【解决方案2】:

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

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

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

    session.storageinstanceof Symfony\Component\HttpFoundation\SessionStorage\NativeSessionStorage

    session_listenerinstanceof Symfony\Bundle\FrameworkBundle\EventListener\SessionListener

    【讨论】:

    • 您好,有问题,感谢您的快速回复。我尝试了$session = $this->container->get('session');,虽然它有效,但似乎没有为会话保存任何内容。我需要做些什么才能将更新的会话数据传回吗?
    • 我检查了 Session 类,它有一个save() 方法。尝试调用它,看看它是否适合你。
    • 天才!这是一种享受。感谢您的所有帮助问题!
    • 所以,设置会话是 $session = $this->getRequest()->getSession(); $session->set('foo', 'bar'); $会话->保存();并在另一个控制器中检索会话是 $session = $this->container->get('session'); ?
    【解决方案3】:

    试试这个解决方案:

    use Symfony\Component\HttpFoundation\Session\Session;
    
    $session = new Session();
    $session->get('variable');
    

    【讨论】:

      【解决方案4】:

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

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

      use Symfony\Component\HttpFoundation\Session\SessionInterface;
      
      class SessionService
      {
          private $session;
      
          public function __construct(
              SessionInterface $session
          )
          {
              $this->session = $session;
          }
      }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 请用英文写。
        猜你喜欢
        • 2016-12-02
        • 2012-12-01
        • 2014-04-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 2014-10-29
        • 2016-10-20
        • 1970-01-01
        相关资源
        最近更新 更多