ZF2获取全局会话容器

时间:2013-12-08 17:29:34

标签: session zend-framework2

我找到了如何获得这样的会话容器: $ session = new \ Zend \ Session \ Container('base');

但是,如果我需要在处理HTTP请求期间在许多地方访问会话,该怎么办呢? 让我们说在IndexController中的Application模块的indexAction中,然后我将它重定向到User \ Controller \ IndexController,需要再次访问会话,然后在一两个视图帮助器中,谁知道更多的更多。

每次重新构造会话容器时,都浪费处理时间。是的,我调试它以查看构造函数中发生了什么,是的,在幕后执行了一些代码。它不像构造函数只返回一个全局变量或其他不可变的东西而且不需要构造过程。

那该怎么办? 我应该为它创建服务吗? 一个控制器插件? 一个助手? 服务和控制器插件以及视图助手,后者调用服务?

我确信这是许多人必须遇到并且已经处理过的事情,但我找不到任何有关此事的信息。

任何提示都非常感激。 提前谢谢了! : - )

5 个答案:

答案 0 :(得分:5)

这是一个更精致和改进的版本。 它由服务“SessionService”,ViewHelper(调用SessionService),ControllerPlugin(也调用SessionService)组成,并显示如何在配置文件“module.config.php”中设置它们。

确保在config中设置“use”路径或使用绝对类路径。

SessionService.php:

class SessionService
{
    protected $sessionContainer;

    public function setSessionContainer(
        $sessionContainer
    ) {
        $this->sessionContainer = $sessionContainer;
    }

    public function __invoke() {
        return $this->sessionContainer;
    }
}

SessionHelper.php:

class SessionHelper extends \Zend\View\Helper\AbstractHelper
{
    protected $sessionService;

    public function setSessionService(
        $sessionService
    ) {
        $this->sessionService = $sessionService;
    }

    public function __invoke() {
        return $this->sessionService;
    }
}

SessionPlugin.php:

class SessionPlugin extends AbstractPlugin
{
    protected $sessionService;

    public function setSessionService(
        $sessionService
    ) {
        $this->sessionService = $sessionService;
    }

    public function __invoke() {
        return $this->sessionService;
    }
}

module.config.php:

'service_manager' => array(
    'factories' => array(
        'sessionService' => function(
            ServiceLocatorInterface $serviceLocator
        ) {
            $sessionContainer = new \Zend\Session\Container('base');
            $sessionService = new SessionService();
            $sessionService->setSessionContainer($sessionContainer);
            return $sessionService;
        },
    ),
),

'controller_plugins' => array(
    'factories' => array(
        'sessionPlugin' => function(
            AbstractPluginManager $pluginManager
        ) {
            $sessionService = $pluginManager->getServiceLocator()->get('sessionService');
            $sessionPlugin = new SessionPlugin();
            $sessionPlugin->setSessionService($sessionService);
            return $sessionPlugin;
        },
    ),
),

'view_helpers' => array(
    'factories' => array(
        'sessionHelper' => function (
            AbstractPluginManager $helperPluginManager
        ) {
            $sessionService = $helperPluginManager->getServiceLocator()->get('sessionService');
            $sessionHelper = new SessionHelper();
            $sessionHelper->setSessionService($sessionService);
            return $sessionHelper;
        },
    ),
),

答案 1 :(得分:2)

在你的控制器中写: -

使用Zend \ Session \ Container;

  1. 制作会话变量

                   $user_session = new Container('user');
    
  2. '用户'是您的会话名称要在会话中输入值:

                    $user_session->username = 'xyz';
    
    1. 存储后您可以通过以下方式访问您的会话:

                                 $user_session->  username
      
    2. 销毁会话变量使用:

       $session = new Container('user');
       $session->getManager()->getStorage()->clear('user');
      

      它就像: -

      未设置($ _ SESSION ['用户']); http://wownewcode.blogspot.in/2013/12/set-session-in-zend-framework-2.html

答案 2 :(得分:0)

初始化会话容器后,您可以使用$ _SESSION ['container_name']重新使用它;

基本上$session = new \Zend\Session\Container('base');会在$ _SESSION中创建一个名为ArrayObject的{​​{1}}。通过创建Container进行初始化的一个优点是,您可以在x-hops之后指定TTL或到期。

base

答案 3 :(得分:0)

我认为您需要使用会话管理器和服务与容器存储来实现您的目标。 您可以在应用程序模块中进行设置             应用程序\ Module.php

使用Zend \ Session \ Config \ SessionConfig;

public function onBootstrap(EventInterface $e)
{   
    //Your other code here 

   //configure session
    $sessionConfig = new SessionConfig();
    $sessionConfig->setOptions($config['session']);

}

并在module.config.php

 'session' => array(
        'save_path' => realpath(ZF2PROJECT_ROOT . '/data/session'),
        'name'      => 'ZF2PROJECT_SESSION',
    ),

在您的服务中,您可以像这样使用。例如,在身份验证服务中。

  class AuthenticationService
{
        protected $storage = null;

        public function getStorage()
        {
            if (null === $this->storage) {
                $this->setStorage(new Storage\Session());
            }

            return $this->storage;
        }
}

答案 4 :(得分:0)

以下是我目前的临时解决方案或解决方法,包括:   - 用于存储会话容器对象的服务。   - 一个控制器插件,可以方便地访问会话容器,而不必在每个控制器中为它注入依赖项。

会话服务:

class Session
{
    private static $container;

    public function getContainer() {
        if (!isset(self::$container)) {
            self::$container = new \Zend\Session\Container('base');
        }
        return self::$container;
    }

    public function __invoke() {
        return $this->getContainer();
    }
}

控制器插件:

class Session extends AbstractPlugin
{
    protected $sessionService;

    public function __construct(
        SessionService $sessionService
    ) {
        $this->sessionService = $sessionService;
    }

    public function getContainer() {
        return $this->sessionService->getContainer();
    }

    public function __invoke() {
        return $this->getContainer();
    }
}

module.config.php中的配置:

'service_manager' => array(
    'factories' => array(
        'sessionService' => function($sm) {
            return new Application\Service\Session\Session();
        },
    ),
),

'controller_plugins' => array(
    'factories' => array(
        'session' => function($serviceLocator) {
            $sessionService = $serviceLocator->get('sessionService');
            return new Application\Service\Mvc\Controller\Plugin\Session($sessionService);
        },
    ),
),

任何控制器或控制器插件方法中的用法示例:

$sessionContainer = $this->session->getContainer();

或简短形式(因为会话服务和控制器插件都实现__invoke):

$sessionContainer = $this->session();

然后可以使用会话容器在其中存储任何变量,如下所示:

$sessionContainer->foo = 'bar';

因为会话服务是由工厂函数通过module.config.php创建的,所以它只创建一次。 实际的会话容器是会话服务中的静态变量,只创建一次,即如果它不存在。 在后续调用getSessionContainer函数时,只返回一次创建的静态会话容器。

这只是一个临时解决方案,暂时适用于我,但为了使其可以重复用于其他应用程序,它应该提供自定义会话容器名称和存储位置和策略的功能,这些部分缺失在这个简单的解决方案中。

注意:不需要视图助手。不应在视图中设置会话变量,如果视图需要对它们具有读访问权限,则应通过视图模型将数据从控制器传递到视图。