Я пытаюсь создать метод для активации пользователей с помощью токена, но я немного не понимаю, как я могу проверить, используя доктрину 2 и отношения.
Здесь вы можете увидеть скрин моих отношений с базой данных.
Это мой пользовательский объект
.............
/**
* @ORM\OneToOne(targetEntity = "App\Entity\Token", mappedBy = "username", cascade = {"persist", "remove"})
*/
private $token;
public function getToken(): ?Token
{
return $this->token;
}
public function setToken(?Token $token): self
{
$this->token = $token;
// set (or unset) the owning side of the relation if necessary
$newUsername = $token === null ? null : $this;
if ($newUsername !== $token->getUsername()) {
$token->setUsername($newUsername);
}
return $this;
}
.............
Это мой токен
.............
/**
* @ORM\OneToOne(targetEntity = "App\Entity\User", inversedBy = "token", cascade = {"persist", "remove"})
*/
private $username;
public function getUsername(): ?User
{
return $this->username;
}
public function setUsername(?User $username): self
{
$this->username = $username;
return $this;
}
.............
Приложение работает, как и ожидалось, когда я регистрирую любого пользователя и электронная почта была отправлена.
В другом проекте без изменений в токене (сохранение токена в той же таблице, что и пользователь) у меня не было проблем с созданием метода, как показано ниже:
.............
/**
* @Route("/activation/{token}/", name = "activation/", methods = {"GET"}))
*/
public function activation(Request $request, User $user, $token)
{
$token = $request->attributes->get('token');
$update = $user->getToken();
$user->setToken(null);
$user->setActive(true);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
return $this->render(
'emails/confirmation.html.twig');
}
.............
Но с помощью этого метода я получаю следующую ошибку. Невозможно угадать, как получить экземпляр Doctrine из информации запроса для параметра.
У кого-нибудь есть идеи?
Спасибо за ваше время.
С уважением.
..............................
РЕДАКТИРОВАТЬ1: ОШИБКА: Невозможно угадать, как получить экземпляр Doctrine из информации запроса для параметра «токен».
КОД:
/**
* @Route("/activation/{pledge}/", name = "activation/", methods = {"GET"}))
*/
public function activation(Request $request, Token $token, $pledge)
{
$user = $pledge->getUsername();
if ( null === $user) {
}
$user->setToken(null);
$user->setActive(true);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
return $this->render(' emails/confirmation.html.twig');
}
}
EDIT2: РЕШЕНИЕ
/**
* @Route("/activation/{token}/", name = "activation/", methods = {"GET"}))
*/
public function activation(Request $request, Token $pledge, $token)
{
$token = $request->attributes->get('token');
$user = $pledge->getUsername();
if ( null === $pledge) {
}
$pledge->setToken(null);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($pledge);
$entityManager->flush();
return $this->render('emails/confirmation.html.twig');
}
Спасибо за Ваш ответ. Ошибка для любого «объекта», который я пытаюсь передать в качестве параметра: невозможно угадать, как получить экземпляр Doctrine из информации запроса для параметра «токен». в этом случае.
В вашей старой настройке объект User
мог быть сопоставлен ParamConverter, потому что, как вы написали, в нем было поле token
.
Теперь поле token
является частью объекта Token
, поэтому вы можете сопоставить объект Token
и получить от него пользователя:
public function activation(Request $request, Token $token)
{
$user = $token->getUsername();
if (null === $user) {
// Here handle the situation with the token already used to activate a user
}
$user->setToken(null);
$user->setActive(true);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
return $this->render( 'emails/confirmation.html.twig');
}
....
Привет Михал. Спасибо за ваш комментарий. я получаю ту же ошибку, в этом случае Token $token - это моя сущность, а $pledge - это токен, который я улавливаю через запрос: /** ........ В этом случае ошибка: Невозможно угадать как получить экземпляр Doctrine из информации запроса для параметра «токен». Проверьте EDIT1: ОШИБКА: спасибо
Привет еще раз. Как вы и сказали, просто мне пришлось изменить некоторые вещи, например nullable=true в моей сущности и некоторых параметрах. Проверьте edit2 для разрешения. Спасибо! ваше здоровье
Какую версию симфони вы используете? Рядом с этим - вы уверены, что вставили всю ошибку? После
... for parameter
в конце сообщения должно быть имя параметра в двойных кавычках.