2016-10-06 11 views
1

私はID、名前、メールなどの属性を持つUserクラスを持っています 私はパスワード回復プロセスを実装しているので、password_recoveryテーブルを作成しました。パスワードリカバリテーブルの作成 - 値を挿入するときのエラー

  • ID
  • USER_ID
  • トークン
  • CreatedDateに
  • expiryDate
  • isExpired

は、これは私のPasswordRecoveryクラスです:

namespace \UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* @ORM\Entity 
* @ORM\Table(name="password_recovery") 
*/ 
class PasswordRecovery { 

    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="User") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    private $idUser; 

    /** 
    * @ORM\Column(type="string") 
    */ 
    private $token; 

    /** 
    * @ORM\Column(type="datetime") 
    * @Assert\DateTime() 
    */ 
    private $createdDate; 

    /** 
    * @ORM\Column(type="datetime") 
    * @Assert\DateTime() 
    */ 
    private $expireDate; 

    /** 
    * @ORM\Column(type="boolean") 
    */ 
    private $expired; } 

ユーザーが自分のパスワードを回復しようとすると、彼は彼のメールアドレスを入力しなければなりません。メールがdbにある場合は、PasswordRecoveryオブジェクトを作成してdbに格納します。これは私がそれをやっている方法である:(コードの小さい部分)

if (!empty($resetMail)) 
     { 

     $recovery = new PasswordRecovery(); 

     $token = bin2hex(openssl_random_pseudo_bytes(16)); 
     $recovery->setToken($token); 
     $userId = $resetMail->getId(); 
     $recovery->setIdUser($userId); 


     $recovery->setCreatedDate(new \DateTime('now')); 

     $expiry = (new \DateTime('now + 1day')); 
     $recovery->setExpireDate($expiry); 
     $recovery->setExpired(false); 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($recovery); 
     $em->flush(); } 

私はこのエラーを得た:

Catchable Fatal Error: Argument 1 passed to \UserBundle\Entity\PasswordRecovery::setIdUser() must be an instance of \UserBundle\Entity\User, integer given, called in /home/user/project/src/UserBundle/Controller/AccountController.php on line 553 and defined 

なぜ?

+0

エラーメッセージから、IdUserはユーザーのIDではなく「ユーザー」オブジェクトである必要があります。 – Kritner

+0

はい、しかし 'idUser'はユーザIDを参照しています。これはINTです –

+1

Doctrine ORMを理解する上で最も大きな概念上のハードルの1つは、SQLデータベースの考え方(ids)からオブジェクトの考え方への移行です。 PasswordRecoveryオブジェクトは、Userオブジェクトにリンクされています。ユーザープロパティを整数として定義したという事実は何も意味しません。 findの代わりにgetReferenceを使用してオブジェクトへの参照を作成することで、完全なユーザーオブジェクトへの読み込みを避けることができます。 – Cerad

答えて

0

setIdDUser(User)を使用する必要があります。これはプロキシオブジェクトです。別のテーブル(エンティティ)への参照であるため

getIdUser()と同じ方法で、プロキシオブジェクトを再度取得します。int値を使用する場合は、getId()を呼び出す必要があります。

関連する問題