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

#php #symfony #routing

#php #symfony #маршруты

Вопрос:

У меня проблема с одним из моих маршрутов, когда я пытаюсь получить к нему доступ, я получаю эту ошибку: «Объект App Entity CompanyUser не найден аннотацией @ParamConverter»

У многих людей такая же проблема, но ни одно из решений, которые я мог видеть, не могло решить мою проблему.

Моя функция редактировать :

 private $passwordEncoder;

public function __construct(UserPasswordEncoderInterface $passwordEncoder)
{
    $this->passwordEncoder = $passwordEncoder;
}

/**
 * @Route("/{id}/edit", name="company_user_edit", methods={"GET","POST"}, requirements={"id"="d "})
 */
public function edit(Request $request, UserPasswordEncoderInterface $passwordEncoder, CompanyUser $user): Response
{
    $em = $this->getDoctrine()->getManager();
    $user = $this->getUser();
    $reset_password_form = $this->get('form.factory')->create(CompanyResetPasswordType::class, $user);
    $reset_password_form->handleRequest($request);

    if ($reset_password_form->isSubmitted() amp;amp; $reset_password_form->isValid()) {

        $this->passwordEncoder->isPasswordValid($this->getUser(), $request->get('password'));
        $oldPassword = $request->request->get('reset_password')['oldPassword'];

        // Si l'ancien mot de passe est bon
        if ($passwordEncoder->isPasswordValid($user, $oldPassword)) {
            $newEncodedPassword = $passwordEncoder->encodePassword($user, $user->getPlainPassword());
            $user->setPassword($newEncodedPassword);

            $em->persist($user);
            $em->flush();

            $this->addFlash('notice', 'Succeed to change your password');

            return $this->redirectToRoute('company_show', ['id' => $user->getCompany()->getId()]);

        } else {
            $reset_password_form->addError(new FormError('Old password is not valid'));
        }
    }

    $edit_form = $this->createForm(CompanyUserType::class, $user);
    $edit_form->handleRequest($request);

    if ($edit_form->isSubmitted() amp;amp; $edit_form->isValid()) {
        $this->getDoctrine()->getManager()->flush();

        return $this->redirectToRoute('company_show', ['id' => $user->getCompany()->getId()]);
    }

    return $this->render('user/edit.html.twig', [
        'user' => $user,
        'edit_form' => $edit_form->createView(),
        'reset_password_form' => $reset_password_form->createView(),
    ]);
}
  

Спасибо за вашу помощь!

Ответ №1:

Вы можете переопределить ParamConverter следующим образом

 /**
 * @Route("/{id}/edit", name="company_user_edit", methods={"GET","POST"}, requirements={"id"="d "})
 * @ParamConverter("id", class="CompanyUser", options={"id": "id"})
 */
  

Ответ №2:

В моем случае проблема заключалась в неправильном имени маршрутизатора для всего контроллера. Я использовал генератор, который делал это автоматически. документы:

 /**
 * @Route("/document")
 */
class DocumentController extends AbstractController


/**
 * @Route("/document/group")
 */
class DocumentGroupController extends AbstractController
  

Я изменил название маршрутизатора

 @Route("/document/group") 
  

Для

 @Route("/document_group")
  

Комментарии:

1. опасно! то же самое только что произошло и здесь. tnx для обмена вашим решением

Ответ №3:

Старая часть маршрута {id} должна измениться на то же имя, что и параметр, который вы преобразуете.

Т.е. изменить:

  * @Route("/{id}/edit", name="company_user_edit", methods={"GET","POST"}, requirements={"id"="d "})
  

Для

  * @Route("/{user}/edit", name="company_user_edit", methods={"GET","POST"}, requirements={"id"="d "})
  

Ответ №4:

Symfony 5.4

У меня есть маршрут для извлечения профиля пользователя

routes.yaml
 manage-users:
    path: /Account/{id}/Manage
    controller: AppControllerRegistrationController::manage
  

При запросе случайного идентификатора пользователя была выдана ошибка «Объект не найден«. Я добавил значение параметра пользовательского объекта по умолчанию как null и включил нулевую проверку в метод контроллера.

RegistrationController.php
 public function manage(User $user = null) <= Default parameter value
{
    try {
        if(null === $user) {
            $this->addFlash("error", "User Not Found");
            return $this->redirectToRoute("home");
        }
     ...
     ...
  

Надеюсь, это полезно, если кто-нибудь проверяет эту проблему.