如何从树枝发送和接收请求参数到控制器

How to send and receive request params from twig to controller

我有一个 Booking 表单,我想预订汽车,我想在发送表单值时创建一个新的 Booking 对象并将其保存在数据库中,汽车和 Booking 与 OneToMany 关系相关。

预订控制器

/**
 * @param Request $request
 * @return Response
 * @Route ("/booking/car/{id}", name="car.book")
 */

 
public function book(Request $request)
    {
        $booked_car = $request->query->get('id');
        $booking = new Booking();
        $booking->setCar($booked_car);
        $form = $this->createForm(BookingType::class, $booking);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()){
            $booking = $form->getData();
            $this->em->persist($booking);
            $this->em->flush();
            $this->addFlash('success', 'Démande envoyée avec success');

            return $this->redirectToRoute('car.index');
        }
        return $this->render('booking/book.html.twig',[
            'booking' => $booking,
            'form' => $form->createView()
        ]);
    }

我列出汽车的索引/只有按钮

<div class="col-2">

   <a class="btn btn-dark mt-2 mb-2" style="border-radius: 0 !important;" href="{{ path('car.book', {id: car.id, car: car}) }}"> Réserver </a>
</div>

form.html.twig

<h3 class="mt-5 mb-5">Vos informations</h3>
<div class="row d-flex" >
    <div class="col-6">
        <div class="row d-flex">
            <div class="col-4">
                {{ form_row(form.driving_license_number) }}
            </div>
            <div class="col-4">
                {{ form_row(form.national_id_card) }}
            </div>
            <div class="col-4">
                {{ form_row(form.passeport_number) }}
            </div>
        </div>
    </div>
</div>


{{ form_widget(form) }}
{{ form_end(form) }}

id参数一直为null,如何从request中获取并搜索id对应的object car设置到Booking对象中?

您需要从注释而不是请求中获取 ID。

类似这样的事情:

public function book(Request $request,CarEntityName $carEntityName)
{
    $booked_car = $carEntityName;
    //....

}

希望对您有所帮助。

您正在使用$booked_car = $request->query->get('id');检索url中的参数,但query指的是查询字符串参数,其中有none。在那种情况下你想使用路线 attributes: $request->attributes->get('id');

更好的是,如果你的控制器动作有一个以参数命名的变量,symfony 会自动绑定它。

public function book(Request $request, $id)

当您调用 setCar 时,您可能需要实体本身而不仅仅是 ID,因此您必须从数据库中加载它。 Symfony 也可以为你加载它,如果你像前面的答案中指出的那样用正确的实体提示变量(因为参数被称为 id,它会尝试通过主键加载它)。