6

你能告诉我如何在 ZF2 中正确使用会话吗?到目前为止,我有这个代码:

"session" =>
[
    "remember_me_seconds" => 2419200, 
    "use_cookies" => true,
    "cookie_httponly" => true
]

那是我从 stackoverflow 上的一些帖子中复制的会话配置。现在我应该将此代码放入使用会话的每个模块中的 module.config.php 中还是应用程序模块中?

public function onBootstrap(EventInterface $Event)
{
    $Config = $Event->getApplication()->getServiceManager()->get('Configuration');
    $SessionConfig = new SessionConfig();
    $SessionConfig->setOptions($Config['session']);
    $SessionManager = new SessionManager($SessionConfig);
    $SessionManager->start();  
    Container::setDefaultManager($SessionManager);
}

Module 类的 onBootstrap() 方法也有同样的问题。这段代码应该进入每个模块的模块类还是只进入应用程序的模块类?

在这两种情况下,我都尝试了这两种方法,甚至尝试将这段代码一次放入两个模块中,但我唯一能完成的就是在控制器的构造函数中设置会话变量,然后在操作/方法中读取它们。我无法在一个操作/方法中设置会话变量,然后在另一个操作/方法中读取它。如果我删除了在控制器的构造函数中设置变量的行,我将无法在会话中看到这些变量。会话的行为就像每次请求页面时创建和删除它一样。

我错过了什么吗?请不要将我链接到互联网上的任何资源,我已经阅读了所有资源,它们并没有真正的帮助。

4

3 回答 3

14

您无需进行任何配置即可在 Zend Framework 2 中使用会话。当然,您可以更改设置,但如果您只想启动并使用会话运行,那么现在不要担心。

我很抱歉,但我将不理会你的最后一句话;大约一个月前,我写了一篇关于这个主题的文章,目的是展示如何快速开始使用 ZF2 中的会话。它在搜索引擎中的排名不是很好,所以你很可能没有读过它。

这是一个代码片段,展示了它是如何完成的。如果您对它在幕后的工作方式感兴趣,请参阅上面的链接。

namespace MyApplication\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\Session\Container; // We need this when using sessions

class UserController extends AbstractActionController {
    public function loginAction() {
        // Store username in session
        $userSession = new Container('user');
        $userSession->username = 'Andy0708';

        return $this->redirect()->toRoute('welcome');
    }

    public function welcomeAction() {
        // Retrieve username from session
        $userSession = new Container('user');
        $username = $userSession->username; // $username now contains 'Andy0708'
    }
}
于 2012-12-27T14:28:32.190 回答
1

关于会话

您想在哪里存储会话(在 mysql-db、mongo-db 或 ram 中,..)?如何将会话分类为“命名空间”,例如

$_SESSION["namespace"]["user"],
$_SESSION["namespace_1"]["user"]?

会话管理器

在 Zend 中,Zend\Session\SessionManger 帮助你做很多上面列出的事情

SessionManger 的简单配置

$sessionManager = new SessionManager();
$sessionStorage = new SessionArrayStorage();
$sessionManager->setStorage($sessionStorage);
//you can add more config, read document from Zend
$sessionContainer = new Container("ABC", $sessionManager);
$sessionContainer->offsetSet("user", "lehoanganh25991");

当您在没有任何 SessionManager 配置的情况下调用新容器时

$sessionContainer = new Container("abc");

在幕后,Zend 创建了一个默认的 SessionManager,然后将它传递给 Container

会话数组存储,$_SESSION

Zend 中的 SessionArrayStorage 可以使用 $_SESSION,我们可以通过user上面的方式访问

$_SESSION["ABC"]["user"]

如果您在 ram 中设置其他存储,如 mysql-db、mongo-db、.. 通过 $_SESSION 访问可能不起作用

访问会话

在模块 A 中,设置会话

我们如何在 Moudle B 中访问它?$sessionContainer 变量在哪里@@?

这很奇怪,但是当您想访问此容器时,请使用 SAME CONFIG 创建一个新容器

$sessionManager = new SessionManager();
$sessionStorage = new SessionArrayStorage();
$sessionManager->setStorage($sessionStorage);
$sessionContainer = new Container("ABC", $sessionManager);
//access
var_dump("get user from \$sessionContainer", $sessionContainer->offsetGet("user"));

在 github 上查看演示:https ://github.com/hoanganh25991/zend-auth-acl/tree/d0a501e73ac763d6ef503bbde325723ea1868351

(通过提交,项目改变了,在这棵树上访问它)

in FronEnd\Controller\IndexController
in AuthAcl\Module.php
in AuthAcl\Service\SimpleAuth
i acces same session at different places
于 2016-04-13T06:59:15.287 回答
0
namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Session\Container;

class IndexController extends AbstractActionController
{   
    // set session values
    public function indexAction()
    {
       $session = new Container('User'); // name your session here by replacing User
$user_session->offsetSet('user_name', "your user name"); // set your session user name
$user_session->offsetSet('user_id', "1232"); //set your session user id
    }

// function to get values from session
  public function getdataAction(){
    $session = new Container('User');
    $user_name= $user_session->offsetGet('user_name'); // get user name from the session
   $user_id= $user_session->offsetGet('user_id'); // get user id from the session
}

// function to unset session values
 public function unsetdataAction(){
   $session = new Container('User');
    $user_session->offsetUnset('user_name'); // unset user name
        $user_session->offsetUnset('user_id');
}
} 
于 2017-04-12T11:25:58.080 回答