Создание таблицы восстановления пароля — Ошибка при вставке значения

#php #symfony #error-handling #doctrine

#php #symfony #обработка ошибок #доктрина

Вопрос:

У меня есть класс пользователя с такими атрибутами, как id, имя, почта и т.д. Я реализую процесс восстановления пароля, поэтому я создал password_recovery таблицу с этими столбцами:

  • ID
  • user_id
  • токен
  • CreatedDate
  • Срок действия
  • Истекло

Это мой PasswordRecovery класс:

 namespace UserBundleEntity;

use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;
use SymfonyComponentValidatorConstraints as Assert;

/**
 * @ORMEntity
 * @ORMTable(name="password_recovery")
 */
class PasswordRecovery {

    /**
     * @ORMColumn(type="integer")
     * @ORMId
     * @ORMGeneratedValue(strategy="AUTO")
     */
    private $id;

    /**  
     * @ORMManyToOne(targetEntity="User")
     * @ORMJoinColumn(name="user_id", referencedColumnName="id")
    */
    private $idUser;

    /** 
     * @ORMColumn(type="string") 
     */
    private $token;

    /** 
     * @ORMColumn(type="datetime")
     * @AssertDateTime() 
    */
    private $createdDate;

    /** 
     * @ORMColumn(type="datetime") 
     * @AssertDateTime() 
    */
    private $expireDate;

     /** 
     * @ORMColumn(type="boolean") 
    */
    private $expired; }
  

Когда пользователь хочет восстановить свой пароль, он должен ввести свой адрес электронной почты. Если почта находится в БД, я создаю PasswordRecovery объект и сохраняю его в БД. Вот как я это делаю: (небольшая часть кода)

 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 UserBundleEntityPasswordRecovery::setIdUser() must be an instance of UserBundleEntityUser, integer given, called in /home/user/project/src/UserBundle/Controller/AccountController.php on line 553 and defined
  

Почему?

Комментарии:

1. Из сообщения об ошибке похоже, что idUser должен быть объектом «User», а не идентификатором пользователя.

2. да, но idUser ссылается на пользователя id , который является INT

3. Одним из самых больших концептуальных препятствий для понимания Doctrine ORM является переход от мышления базы данных sql (ids) к объектному мышлению. Объекты PasswordRecovery связаны с объектами пользователя. Тот факт, что вы определили свойство user как целое число, ничего не значит. Вы можете избежать загрузки в полном пользовательском объекте, создав ссылку на объект, используя getReference вместо find .

4. @Cerad Спасибо за предложение

Ответ №1:

Вам нужно использовать setIdDUser(User) . Это прокси-объект, потому что это ссылка на другую таблицу (сущность)

Таким же образом при вызове getIdUser() вы снова получите прокси-объект, к которому вам нужно будет обратиться getId() , если вам нужно значение int.