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
なぜ?
エラーメッセージから、IdUserはユーザーのIDではなく「ユーザー」オブジェクトである必要があります。 – Kritner
はい、しかし 'idUser'はユーザIDを参照しています。これはINTです –
Doctrine ORMを理解する上で最も大きな概念上のハードルの1つは、SQLデータベースの考え方(ids)からオブジェクトの考え方への移行です。 PasswordRecoveryオブジェクトは、Userオブジェクトにリンクされています。ユーザープロパティを整数として定義したという事実は何も意味しません。 findの代わりにgetReferenceを使用してオブジェクトへの参照を作成することで、完全なユーザーオブジェクトへの読み込みを避けることができます。 – Cerad