Doctrine 2实体管理器对象上的非对象错误

时间:2011-12-02 23:37:52

标签: zend-framework doctrine-orm

我正在通过阅读一本书来学习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> &bull; <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

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 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是包含电子邮件地址的属性。