Работа с доктриной и отношениями, как? - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь создать метод для активации пользователей с помощью токена, но я немного растерялся из-за того, как я могу проверить, используя доктрину 2 и отношения.

Здесь вы можете увидеть экран моегоотношения с базой данных.

enter image description here

Это мой пользовательский объект

.............
/**
     * @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 из информации запроса для параметра.

Кто-нибудь есть идеи?

Спасибо за ваше время.

С уважением.

..............................

EDIT1: ОШИБКА: невозможно угадать, как получить экземпляр Doctrine из информации запроса fили параметр "токен".

КОД:

    /**
    * @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');
    }
}

РЕДАКТИРОВАТЬ 2: РЕШЕНИЕ

/**
    * @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');
    }

1 Ответ

1 голос
/ 08 апреля 2019

В вашей старой установке сущность 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');

}

 ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...