如何将_SESSION('userName')从此Zend_Auth方法传递到布局?

时间:2010-08-02 05:26:51

标签: zend-framework zend-session

我很难理解Zend_Session_Namespace如何与Zend_Auth集成。我使用这种方法作为验证登录页面的操作 - 它正常工作并重定向到/月视图:

 public function authAction(){
    $request    = $this->getRequest();
    $registry   = Zend_Registry::getInstance();
    $auth       = Zend_Auth::getInstance(); 

    $DB = $registry['DB'];

    $authAdapter = new Zend_Auth_Adapter_DbTable($DB);
    $authAdapter->setTableName('users')
                ->setIdentityColumn('UserName')
                ->setCredentialColumn('Password');    

// Set the input credential values
    $uname = $request->getParam('UserName');
    $paswd = $request->getParam('Password');
    $authAdapter->setIdentity($uname);
    $authAdapter->setCredential($paswd);

   // Perform the authentication query, saving the result
    $result = $auth->authenticate($authAdapter);

       // TRYING TO SET THE NAMESPACE
        $this->session = new Zend_Session_Namspace('UserName');

    if($result->isValid()){
        $data = $authAdapter->getResultRowObject(null,'password');
        $auth->getStorage()->write($data);
        $this->_redirect('/monthly');

    }else{
        $this->_redirect('/login');
    }
}

但是我需要能够将UserName存储为Zend_session并从每月控制器调用它。我做得不对,因为当我尝试这样做时,我只是得到一个空白的屏幕:

public function indexAction()
{

$this->view->userName = Zend_Session_Namespace('UserName');
}

3 个答案:

答案 0 :(得分:1)

您没有使用正确的命名空间。 Zend_Auth使用Zend_Auth命名空间。命名空间是结构,而不是值的键。所以你的会话看起来像这样:

Array('Zend_Auth' => array ('UserName' => 'myname')

这不完全准确,因为你没有存储用户名,除非你直接在你的适配器中提供了这个。你需要做一些事情:

$auth->getStorage()->UserName = 'myusername';

然后您可以使用$authData = new Zend_Session_Namespace('Zend_Auth'); $username = $authData->UserName;进行访问。

仔细研究Zend_Auth_Adapter_Db的工作原理。

答案 1 :(得分:1)

使用以下行:

$data = $authAdapter->getResultRowObject(null,'password');
$auth->getStorage()->write($data);

您正在编写除密码之外的所有用户信息,这是正常的。无论您何时需要访问登录用户的详细信息,您都可以执行类似的操作(根据您的评论更新):

public function indexAction() {
    $auth = Zend_Auth::getInstance();
    if($auth->hasIdentity()) {
        $userData = $auth->getIdentity();
        $this->view->user = $userData;
    }
}
视图文件(index.phtml)中的

只是:echo $this->user->firstname

就是这样。如果有一天你决定将Zend_Auth的存储从会话更改为例​​如数据库,那么这段代码仍然有效。

答案 2 :(得分:0)

这是我的方法,它很好用:  1-i首先在bootstrap中定义一个init函数

protected function _initSession()

{

$UserSession = new Zend_Session_Namespace('UserSession');
$UserSession->setExpirationSeconds(/* you may fix a limit */);
Zend_Registry::set('UserSession', $UserSession);

}

在正确的用户名和&之后,在登录操作中

/ * pwd * /

// Create session
$UserSession = Zend_Registry::get('UserSession'); 
// Get the user from database or just from fields
//you have to make sure that the psswd is encrypted use MD5 for example..
 $db = Zend_Db_Table::getDefaultAdapter();
$user = $db->fetchRow("SELECT * FROM user_table WHERE user_email = '".$user_email."'");
//then you assign to $user to $UserSession variable : 
$UserSession->user = $user;
//finaly don't forget to unset session variable in the Logout action ...