1

这是我的代码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());
}

我收到此错误:

致命错误:在第 49 行的 /home/shwetanka/src/Practo/PvrBundle/Manager/SessionManager.php 中的非对象上调用成员函数 getUsername()

当我在var_dump($user);问题行之前做的时候,我正在打印完整的用户对象。我无法理解这个错误的原因。该函数存在于 User 类中。即使我尝试调用该类的任何其他函数,即使那样我也会得到该函数的相同错误。我是 php 新手,很难调试这个问题。

$user 也是 User 实体的对象。我正在使用 symfony2,这个对象是通过使用这个返回给我的:

$ur = $this->getDoctrine()->getRepository('PractoPvrBundle:User');
$user = $ur->findBy(array('email' => $email));
4

3 回答 3

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) {...

如果您获得不同的类实例或非对象,这将引发错误

于 2012-07-13T22:59:32.140 回答
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)));
于 2012-07-13T23:00:15.360 回答
0
$ur = $this->getDoctrine()->getRepository('PractoPvrBundle:User');
$user = $ur->findBy(array('email' => $email));

-> findBy返回对象数组,使用-> findOneBy

于 2012-07-18T17:40:16.837 回答