9

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

形式

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

提交时,表单会生成以下 URL:

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

所需网址:

search?q=red+apple

提前致谢!

4

2 回答 2

17

要创建所需的 URL,您必须设置表单名称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到您的 URL,您需要将其添加到您的表单中:

->add('page', 'text') 
于 2013-10-11T04:40:43.487 回答
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();
        // ...
    }
    // ...
}
于 2017-02-17T17:21:59.047 回答