我正在通过阅读一本书来学习zend框架。到目前为止,其中的所有代码都有效,但现在我无法验证用户身份。该书建议通过行动助手和学说2的实体经理来做到这一点。
这是我正在使用的代码
我的身份验证助手类......
public function init()
{
// Initialize the errors array
Zend_Layout::getMvcInstance()->getView()->errors = array();
$auth = Zend_Auth::getInstance();
$em = $this->getActionController()->getInvokeArg('bootstrap')->getResource('entityManager');
if ($auth->hasIdentity()) {
$identity = $auth->getIdentity();
if (isset($identity)) {
$user = $em->getRepository('Entities\User')->findOneByEmail($identity);
Zend_Layout::getMvcInstance()->getView()->user = $user;
}
}
}
实体存储库功能......
public function findOneByEmail($email)
{
$rsm = new ResultSetMapping;
$rsm->addEntityResult('Entities\User', 'a');
$rsm->addFieldResult('a', 'id', 'id');
$rsm->addFieldResult('a', 'email', 'email');
$rsm->addFieldResult('a', 'fname', 'fname');
$query = $this->_em->createNativeQuery(
'SELECT a.id, a.fname, a.email FROM users a
WHERE a.email = :email',
$rsm
);
$query->setParameter('email', $email);
return $query->getResult();
}
在页面视图中,我使用以下代码检查用户是否已登录:
<?php
if($this->user){
?>Welcome back, <a href="/user/"><?php echo $this->user->fname; ?></a> • <a href="/user/logout/">Logout</a><?php
} ?>
if条件在我登录时通过,但不会打印用户名。
这是我收到的错误消息:
Notice: Trying to get property of non-object in C:\Program Files (x86)\Zend\Apache2\htdocs\dev.test.com\application\views\scripts\user\index.phtml on line 3
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
我认为问题的一部分在这里:
if (isset($identity)) {
$user = $em->getRepository('Entities\User')->findOneByEmail($identity);
Zend_Layout::getMvcInstance()->getView()->user = $user;
}
看起来findOneByEmail希望将电子邮件地址作为参数,但传递整个身份对象。
这可能导致return $query->getResult();
返回null或false,因此$view->user
不是对象且没有属性fname。
我认为在findOneByEmail中你需要做$user = $em->getRepository('Entities\User')->findOneByEmail($identity->email);
之类的事情,其中$identity->email
是包含电子邮件地址的属性。