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 に答える