session - ZF2获取全局 session 容器

标签 session zend-framework2

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

但是如果我需要在处理 HTTP 请求期间在许多地方访问 session 怎么办? 假设在 IndexController 中的应用程序模块的 indexAction 中,然后我将其重定向到 User\Controller\IndexController 并需要再次访问 session ,然后在一个或两个 View 助手中,谁知道要访问多少次。

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

那么该怎么办呢? 我应该为它创建一个服务吗? Controller 插件? View 助手? 一个服务和一个 Controller 插件以及一个 View 助手,后者调用服务?

相信很多人都遇到过并处理过这个问题,但我找不到这方面的任何信息。

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

最佳答案

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

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

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

模块.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;
        },
    ),
),

关于session - ZF2获取全局 session 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20456500/

相关文章:

javascript - 每当我点击网站内的页面链接时,我都会注销,如何修复?

hibernate - 将 Hibernate 条件查询转换为 JPA 2 条件查询

php - zend 框架 2 : how to properly inject factory to controller to get different mapper classes?

php - 如何在 ZF2 的 sql 语句中准备 sql 语句?

php - 使用 ZfcUser 对 Controller 进行简单的 ZF2 单元测试

php - Doctrine 从数据库更新实体

.net - 用于模拟 HTTP 事务的库,例如具有 cookie 和 session 支持的浏览器

multithreading - 从数据中获取 session

session - 在 Coldfusion 中丢失 session

php - ZF2 ServiceLocatorAwareInterface getServiceLocator 给我 Zend\Validator\ValidatorPluginManager