Ошибка контроллера, когда токена нет в базе данных - PullRequest
0 голосов
/ 18 июня 2020

В настоящее время я создаю функцию сброса пароля для своего веб-сайта в Symfony 5, и со вчерашнего дня ошибка убивает мой мозг.

В моем контроллере у меня есть это:

/**
 * @Route("/reset/{token}", name="reset")
 */
public function reset(User $user, Request $request, UserPasswordEncoderInterface $passwordEncoder, $token)
{ 
    //...
}

Если я нахожусь на своем веб-сайте с этим URL localhost:8000/reset/VALID_TOKEN, все в порядке. Но если токен недействителен (в базе данных нет), я получил эту ошибку:

Объект App \ Entity \ User не найден аннотацией @ParamConverter.

Я обнаружил, что это произошло из-за параметра User $user в моей функции, но я не понимаю, как и где Symfony обрабатывает этот объект User. Я просто даю ему токен, и он автоматически находит соответствующего пользователя (а это то, что я хочу).

Моя цель - предотвратить случай, когда токен неправильный, и перенаправить пользователя на другую страницу.

1 Ответ

0 голосов
/ 18 июня 2020

Чтобы получить доступ к текущему авторизованному пользователю (без учета токена на данный момент), можно и нужно сделать, вызвав $user = $this->getUser(); в контроллере, а НЕ добавив пользователя в заголовок метода (так что удалите это).

затем вы можете проверить:

if($user->getToken() != $token) {
    return $this->redirect....
}

вы должны удалить аннотацию ParamConverter, если это то, что вы хотели.

исходный ответ ниже:


User является сущностью и не может быть предоставлен с помощью автоматического подключения symfony. Резервным вариантом для параметров функции контроллера является использование ParamConverter, чтобы каким-то образом получить пользователя из репозитория, используя соответствующие заполнители вашего запроса. Использование {token} (его значение) в качестве идентификатора (по умолчанию id) - видимо, тоже не работает. Недостаточно умен, чтобы понять, что с помощью {token} вы хотите запрашивать объекты User, чье свойство token является значением.

Это приводит к вашему сообщению об ошибке.

Если вы действительно хотите использовать токен для выборки пользователя с помощью ParamConverter, вы должны предоставить ему несколько подсказок, как это сделать.

Вы можете добавить следующую аннотацию (возможно, вам придется добавить условие использования use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;):

@ParamConverter("user", options={"mapping": {"token": "token"}})

при условии, что токен является частью вашего объекта User и хранится в базе данных.

Источник: https://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html

...