以下是我的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));
答案 0 :(得分:2)
让用户退出返回状态,如:
$username = $user->getUsername();
return sha1($bits . time() . microtime() . $username);
如果这不能解决问题,出于调试目的,您可以尝试:
$username = 'N/A';
if(is_object($user) && method_exists($user, 'getUsername'))
{
$username = $user->getUsername();
}
您也可以将参数$ user转换为:
private function generateAuthToken(User $user) {...
如果您获得不同的类实例或非对象
,则会抛出错误答案 1 :(得分:2)
有时在隐式转换为字符串的上下文中,PHP不能很好地处理方法调用...我不知道为什么。试试这个:
$username = $user->getUsername();
return sha1($bits . time() . microtime() . $username);
另外,我怀疑你实际上是在处理一个数组而不是一个对象。这一行:
$user = $ur->findBy(array('email' => $email));
可能旨在返回许多结果。使用current()获取第一个:
$user = current($ur->findBy(array('email' => $email)));
答案 2 :(得分:0)
$ur = $this->getDoctrine()->getRepository('PractoPvrBundle:User');
$user = $ur->findBy(array('email' => $email));
<强> - &GT; findBy 返回对象数组,使用 - &gt; findOneBy 强>