#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
, который является INT3. Одним из самых больших концептуальных препятствий для понимания Doctrine ORM является переход от мышления базы данных sql (ids) к объектному мышлению. Объекты PasswordRecovery связаны с объектами пользователя. Тот факт, что вы определили свойство user как целое число, ничего не значит. Вы можете избежать загрузки в полном пользовательском объекте, создав ссылку на объект, используя getReference вместо find .
4. @Cerad Спасибо за предложение
Ответ №1:
Вам нужно использовать setIdDUser(User)
. Это прокси-объект, потому что это ссылка на другую таблицу (сущность)
Таким же образом при вызове getIdUser()
вы снова получите прокси-объект, к которому вам нужно будет обратиться getId()
, если вам нужно значение int.