Как работать с учением и отношениями?

Я пытаюсь создать метод для активации пользователей с помощью токена, но я немного не понимаю, как я могу проверить, используя доктрину 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');
    }

Какую версию симфони вы используете? Рядом с этим - вы уверены, что вставили всю ошибку? После ... for parameter в конце сообщения должно быть имя параметра в двойных кавычках.

Michał Tomczuk 07.04.2019 23:39

Спасибо за Ваш ответ. Ошибка для любого «объекта», который я пытаюсь передать в качестве параметра: невозможно угадать, как получить экземпляр Doctrine из информации запроса для параметра «токен». в этом случае.

CitizenG1 08.04.2019 06:58
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
304
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашей старой настройке объект 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: ОШИБКА: спасибо

CitizenG1 08.04.2019 07:01

Привет еще раз. Как вы и сказали, просто мне пришлось изменить некоторые вещи, например nullable=true в моей сущности и некоторых параметрах. Проверьте edit2 для разрешения. Спасибо! ваше здоровье

CitizenG1 08.04.2019 07:26

Другие вопросы по теме