我一直在尝试使用一个输入创建一个非常基本的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
提前致谢!
答案 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=
,一种方法是将search
从submit
更改为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();
// ...
}
// ...
}