Symfony 2基本GET表单生成的URL

时间:2013-10-11 01:40:49

标签: forms url symfony get formbuilder

我一直在尝试使用一个输入创建一个非常基本的symfony表单(用于搜索功能)。它在提交时使用GET方法。它似乎按预期工作,但它会生成一个非常丑陋和不必要的长URL。我一直试图“清理”网址已经有一段时间了,我想知道是否有人遇到同样的问题而且知道如何修复它?

表格

$form = $this->createFormBuilder($search)
            ->setMethod('GET')
            ->add('q', 'text')
            ->add('search', 'submit')
            ->getForm();

在提交表单时,会生成以下网址:

search?form[q]=red+apple&form[search]=&form[_token]=bb342d7ef928e984713d8cf3eda9a63440f973f2

所需网址:

search?q=red+apple

提前致谢!

2 个答案:

答案 0 :(得分:17)

要创建所需的网址,您必须使用createNamedBuilder设置表单名称,然后将其留空''。 要删除_token,您需要将csrf_protection设置为false。请查看csrf保护,以确保您知道如果关闭它会发生什么。

将代码更改为以下内容可为您提供所需的结果。

$form = $this->get('form.factory')->createNamedBuilder('', 'form', $search, array(
            'csrf_protection' => false,
         ))->setMethod('GET')
           ->add('q', 'text')
           ->add('search', 'submit')
           ->getForm();

这应该产生如下的URL:

search?q=red+apple&search=

修改

如果您想摆脱&search=,一种方法是将searchsubmit更改为button

->add('search', 'button')

这将需要javascript来提交您的表单。 这是jquery中的简单示例:

//This assumes one form and one button
$(document).ready(function(){
    $('button').click(function(){
        $('form').submit();
    });
});

这将生成如下的URL:

search?q=red+apple

要访问GET变量,请在控制器中输入以下内容:

public function yourSearchAction(Request $request)
{
    // your code ...

    $form->handleRequest($request);

    if ($form->isValid()) {

        $getVars = $form->getData();

        $q = $getVars['q'];
        $page = $getVars['page'];
        $billing = $em

        //Do something

    }

    return //your code

}

为了澄清您是否要在网址中添加page,您需要将其添加到表单中:

->add('page', 'text') 

答案 1 :(得分:3)

老问题但是,对于想要了解的人来说,这也是一项工作(Symfony 2.8):

<?php
// src/AppBundle/Form/SearchType.php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SearchType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->setMethod('GET')
            ->add('q', TextType::class)
            ->add('submit', SubmitType::class))
        ;
    }

    public function getBlockPrefix(){
        return '';
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'csrf_protection' => false,
        ]);
    }
}

在您的控制器中:

<?php
//...
use AppBundle\Form\SearchType;
//...
public function yourSearchAction(Request $request)
{
    $form = $this->createForm(SearchType::class);

    $form->handleRequest($request);

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

        $q = $form->get('q')->getData();
        // ...
    }
    // ...
}