ZF2中的会话

时间:2012-12-25 16:15:27

标签: php session zend-framework2

你能告诉我如何在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()方法存在同样的问题。这段代码应该进入每个模块的Module类,还是仅进入Application的Module类一次?

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

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

3 个答案:

答案 0 :(得分:14)

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

道歉,但我将无视你的最后一句话;大约一个月前,我写了一篇article about this subject,目的是展示如何快速开始使用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'
    }
}

答案 1 :(得分:0)

关于会话

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

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

SessionManager

在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配置的情况下调用新Container时

$sessionContainer = new Container("abc");
在幕后,Zend创建一个默认的SessionManager,然后将其传递给Container

SessionArrayStorage,$ _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

答案 2 :(得分: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');
}
}