Проблема с аннотацией ParamConverter - PullRequest
0 голосов
/ 10 июля 2019

Я работаю над почтовым ящиком между двумя пользователями для моего приложения. Я сделал контроллер, форму и представление, все работает, за исключением случаев, когда я добавляю сущность Ad в MessageController, чтобы вернуть информацию об объявлении, для просмотра.

Сообщение об ошибке: App\Entity\Ad object not found by the @ParamConverter annotation.

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

Например, мой BookingController, который работает:

/**
     * @Route("/ads/{id}/booking", name="ad_booking")
     * @IsGranted("ROLE_USER")
     * 
     * @return Response
     */
    public function booking(Ad $ad, Request $request, ObjectManager $manager)
    {
        $booking = new Booking;        

        $form = $this->createForm(BookingType::class, $booking);


        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid())
        {
            $user = $this->getUser();
                $booking->setBooker($user) 
                        ->setAd($ad)
                        ;

            if(!$booking->isAvailableDate())
            {
                $this->addFlash(
                    'warning',
                    'Attention, les dates que vous avez choisies ne sont pas disponibles, elles ont déjà été réservées.'
                );
            }
            else
            {
            $manager->persist($booking);

            $manager->flush();

            $this->addFlash(
                'success',
                "Votre réservation a bien été effectuée !"
            );

            return $this->redirectToRoute('booking_show', [
                'id' => $booking->getId(),
                'withAlert' => true
            ]);
            }
        }

        return $this->render('booking/booking.html.twig', [
            'ad' => $ad,
            'bookingForm' => $form->createView()
        ]);

    }

Мой MessageController, который не работает:

namespace App\Controller;


use App\Entity\Ad;
use App\Entity\Message;
use App\Form\MessageType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class MessageController extends AbstractController
{

     /**
     * @Route("/ads/{id}/message", name="message_provider")
     * @IsGranted("ROLE_USER")
     * 
     * @return Response
     */
    public function message(Ad $ad, Request $request, ObjectManager $manager)
    {
        $message = New Message();

        $form = $this->createForm(MessageType::class, $message);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()) {
            $ad = $this->getAd();
            $user = $this->getUser();
            $message->setSender($user) 
                        ->setAd($ad)
                    ;


            $manager->persist($message);
            $manager->flush();
            $this->addFlash(
                'success', 
                "Votre message n°{$message->getId()} a bien été envoyé." 
            );
            return $this->redirectToRoute('message_show', [
                'id' => $message->getId()
            ]);
        }
        return $this->render('message/new.html.twig', [
            'form' => $form->createView()
        ]);
    }

    /**
     * @Route("/message/{id}", name="message_show")
     * 
     * @return Response
     */
    public function showmessage(Message $message)
    {

        return $this->render('message/show.html.twig', [
            'message' => $message,
        ]);
    }
}

и моя Message сущность

namespace App\Entity;

use DateTime;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\MessageRepository")
 */
class Message
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="text")
     */
    private $content;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="messages")
     * @ORM\JoinColumn(nullable=false)
     */
    private $receiver;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="sentMessages")
     * @ORM\JoinColumn(nullable=false)
     */
    private $sender;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Ad", inversedBy="messages")
     * @ORM\JoinColumn(nullable=false)
     */
    private $ad;

    /**
     * @ORM\Column(type="datetime")
     */
    private $createdAt;

Я все еще получал сообщение об ошибке App\Entity\Ad object not found by the @ParamConverter annotation., даже когда пытался определить @ParamConverter в аннотации. Я не вижу, что не так.

Ответы [ 2 ]

0 голосов
/ 15 июля 2019

Извините, у меня возникла проблема с подключением. Действительно, я понял, что $ad = $this->getAd(); не был необходим, моя функция message в моем MessageController теперь выглядит так:

/**
     * @Route("/ads/{id}/message", name="message_provider")
     * @IsGranted("ROLE_USER")
     * 
     * @return Response
     */
    public function message(Ad $ad, Request $request, ObjectManager $manager)
    {
        $message = New Message();

        $form = $this->createForm(MessageType::class, $message);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()) {
            $user = $this->getUser();
            $message->setSender($user) 
                        ->setAd($ad)
                    ;


            $manager->persist($message);
            $manager->flush();
            $this->addFlash(
                'success', 
                "Votre message n°{$message->getId()} a bien été envoyé." 
            );
            return $this->redirectToRoute('message_show', [
                'id' => $message->getId()
            ]);
        }
        return $this->render('message/new.html.twig', [
            'form' => $form->createView(),
            'ad' => $ad
        ]);
    }

но это все равно не работает, я не знаю почему.

0 голосов
/ 10 июля 2019

Не уверен, что это связано, но мне кажется, что вы никогда не используете объект $ ad, созданный из {id}, в своем функциональном сообщении.Я думаю, что вы используете идентификатор своего объявления или объектного объявления в форме $ this-> getAd (), и вы никогда не используете его на маршруте {id}.Возможно, это не так, попробуйте уточнить, что такое $ ad для этой функции (из маршрута {id} или из формы).

Если бы мне пришлось делать ставку, я бы сказал, что эта строка вам не нужна: $ad = $this->getAd(); потому что вы не идентифицируете ваше текущее использованное объявление в форме, но на маршруте.

(Это должен быть комментарий, но я пока не могу комментировать)

...