这是我的SessionManager.php
:代码
private function generateAuthToken($user)
{
$bits = '';
$fp = @fopen('/dev/urandom', 'rb');
if ($fp !== false) {
$bits .= @fread($fp, 128);
@fclose($fp);
}
return sha1($bits . time() . microtime() . $user->getUsername());
}
我得到这个错误:
致命错误:在非对象上调用成员函数getUsername()在里面/home/shwetanka/src/Practo/PvrBundle/Manager/SessionManager.php在线49
当我在问题行之前执行var_dump($user);
时,我将打印完整的用户对象。我无法理解这个错误的原因。该函数存在于类User中。即使我试图调用该类的任何其他函数,我也会得到该函数的相同错误。我是php的新手,很难调试这个问题。
$user也是user实体的对象。我正在使用symfony2,这个对象通过使用以下命令返回给我:
$ur = $this->getDoctrine()->getRepository('PractoPvrBundle:User');
$user = $ur->findBy(array('email' => $email));
有时在隐式转换为字符串上下文中,PHP不能很好地处理方法调用。。。我不知道为什么。试试这个:
$username = $user->getUsername();
return sha1($bits . time() . microtime() . $username);
编辑:
此外,我怀疑您实际处理的是数组,而不是对象。线路:
$user = $ur->findBy(array('email' => $email));
可能旨在返回许多结果。使用current()获取第一个:
$user = current($ur->findBy(array('email' => $email)));
让用户退出返回,如:
$username = $user->getUsername();
return sha1($bits . time() . microtime() . $username);
如果这还不能解决问题,出于调试目的,您可以尝试:
$username = 'N/A';
if(is_object($user) && method_exists($user, 'getUsername'))
{
$username = $user->getUsername();
}
此外,您还可以投射您的参数$user-like:
private function generateAuthToken(User $user) {...
如果您获得不同的类实例或非对象
$ur = $this->getDoctrine()->getRepository('PractoPvrBundle:User');
$user = $ur->findBy(array('email' => $email));
->findBy返回对象数组,使用->findOneBy