Symfony - 表单重定向

时间:2016-02-10 13:01:49

标签: symfony

我正在Symfony建造一个简单的汽车租赁应用程序,用于我大学的编程课程。

在URL /搜索中,我向用户显示一个表单。现在,当提交表单时,用户再次/搜索,但会呈现不同的模板

这是表单代码:

class SearchQueryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('pickupCity', TextType::class)
            ->add('returnCity', TextType::class)
            ->add('pickupDateTime', DateTimeType::class, array(
                'years' => range(2016,2017),
                'error_bubbling' => true,
            ))
            ->add('returnDateTime', DateTimeType::class, array(
                'years' => range(2016,2017),
                'error_bubbling' => true,
            ))

            ->add('save', SubmitType::class, array(
                'label' => 'Find Car',
                'attr' => array(
                    'class' => 'btn-secondary btn-lg'
                )))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\SearchQuery',
        ));
    }
}

此路线的控制器:

class SearchController extends Controller
{
    public function searchAction(Request $request)
    {
        $query = new SearchQuery();

        $form = $this->createForm(SearchQueryType::class, $query);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            /* Some logic here */

            return $this->render('AppBundle:default:results.html.twig', array(
                'form' => $form->createView()
            ));
        }

        return $this->render('AppBundle:default:search.html.twig', array(
            'form' => $form->createView()
        ));
    }
}

但是,当提交表单时,我想重定向到URL / results?SUBMITTED-PARMS-HERE,因此用户可以将此链接发送给某人并收到相同的结果。在/结果我再次使用魔杖渲染表格,这次填写了提交的搜索参数并在下面呈现可用的汽车。

我不知道它是否是处理此问题的最佳方法,当前解决方案有效,但链接无法发送给其他人。

修改

我将代码更改为fallowing:

 if ($form->isSubmitted() && $form->isValid()) {

            $data = $form->getData();
            $session = $this->get('session');

            $session->set('pickupCity', $data->getPickupCity());
            $session->set('returnCity', $data->getReturnCity());
            $session->set('pickupDateTime', $data->getPickupDateTime());
            $session->set('returnDateTime', $data->getReturnDateTime());

            return $this->redirectToRoute('results', array(
                'pickupCity' => $data->getPickupCity(),
                'returnCity' => $data->getReturnCity(),
                'pickupDate' => $data->getPickupDateTime()->format('d-m-Y-H-i'),
                'returnDate' => $data->getReturnDateTime()->format('d-m-Y-H-i'),
             ), 301);
        }

因此我收到了网址./results/Paris/Berlin/10-02-2016-10-00/17-02-2016-10-00

在routing.yml:

results:
    path:     /results/{pickupCity}/{returnCity}/{pickupDate}/{returnDate}
    defaults: { _controller: AppBundle:Search:result}
    methods:  [POST]

因为我只想在此路线上收到POST请求,现在当我提交表单时,我会收到错误页面说:

No route found for "GET /results/Paris/Berling/01-07-2016-00-00/01-11-2016-00-00": Method Not Allowed (Allow: POST)

知道怎么解决吗?

编辑2:

没关系,我的推理很糟糕。

2 个答案:

答案 0 :(得分:0)

不确定,但可能使用此示例。

$this->redirect($this->generateUrl('default', array('pickupCity' => $pickupCity, 'returnCity' => $returnCity, 'pickupDateTime' => $pickupDateTimepickupDateTime)));

使用您自己的参数,您可以在其中放置评论

  /* Some logic here */

答案 1 :(得分:0)

您可以使用getQueryString()功能。

样品:

 if ($form->isSubmitted() && $form->isValid()) {
    return $this->redirect('results?'.$request->getQueryString());
 }