Url Symfony2.1使用带有GET方法的表单

Url Symfony2.1使用带有GET方法的表单,url,symfony-forms,symfony-2.1,Url,Symfony Forms,Symfony 2.1,我需要有关使用Symfony2.1表单和method=GET以及干净的URL空间的帮助 我正在创建一个“过滤器”,我想在URL中设置它,这样人们就可以为他们的链接添加书签 因此,代码非常简单: $form = $this->createFormBuilder($defaultData) ->add('from', 'date', array('required' => false, 'widget' => 'single_text', 'format' =>

我需要有关使用Symfony2.1表单和method=GET以及干净的URL空间的帮助

我正在创建一个“过滤器”,我想在URL中设置它,这样人们就可以为他们的链接添加书签

因此,代码非常简单:

$form = $this->createFormBuilder($defaultData)
    ->add('from', 'date', array('required' => false, 'widget' => 'single_text', 'format' => 'dd.MM.yyyy'))
我渲染表单小部件,一切都很好

但是,当我提交表单时,它会生成非常难看的GET参数:

/app_dev.php/de/event?form%5Bfrom%5D=17.11.2012
这是因为输入名称当然是
form[from]

因此,为了清理URL空间,我为自己创建了一个主题:

{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ id }}"{% if read_only %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %}
    {% for attrname,attrvalue in attr %}{{attrname}}="{{attrvalue}}" {% endfor %}
{% endspaceless %}
{% endblock widget_attributes %}
其中,我将
name=“{{full_name}}”替换为
name=“{{id}}”

这很有效-我的URL空间更干净:

/app_dev.php/de/event?form_from=17.11.2012
我想我可以接受这一点——尽管理想情况下,
from=xxx
会更好。这是第一个也是更次要的问题


第二个问题是,我不能再让表单绑定了——这很明显,因为参数“form”不再设置——“form_from”已经替换了它,但是当您进行绑定时,它仍然需要表单[]

我试着这样解决这个问题:

$fromDate = $this->get('request')->query->get('form_from', null);
$request->query->set('form', array('from' => $fromDate);
但这不起作用。我还怀疑我目前正在挖一个巨大的漏洞


因此,问题是:我应该使用
表单%5b from%5D
url,还是有更好的方法来完成所有这些(显然不使用POST)?

您可以将根表单的名称设置为空,那么您的字段名将只是
表单
。通过

// the first argument to createNamedBuilder() is the name
$form = $this->get('form.factory')->createNamedBuilder(null, 'form', $defaultData)
    ->add('from', 'date', array(
        'required' => false,
        'widget' => 'single_text',
        'format' => 'dd.MM.yyyy'
    ));

使用
返回nullAbstractType::getName
实现中,code>近来似乎具有相同的效果。

旧线程,但值得一提的是,symfony 3完全忽略了
getName

但是,如果需要表单名称为空,可以对
getBlockPrefix
执行相同的操作

public function getBlockPrefix() {
    return null;
}

这将导致表单字段的命名不带前缀。

将表单类型用作服务时,是否可以执行类似操作?我认为您无法在该上下文中访问createNamedBuilder,而使用FormType::getName(){return“”;}会导致将FormType作为服务引用时出现问题。当然,您可以访问createNamedBuilder(),您只需要访问表单工厂:)
$builder->getFormFactory()
。。。谁知道呢?谢谢FormFactory->
createNamed
可用于获取
表单
实例,而不是builder@caponica当使用表单作为服务时,您是否找到了解决方案?我被困在这上面了!但是,如果formtype返回null,则无法使用依赖项注入生成formtype。通常情况下,无法将此方法用于DI。返回null相当于接受的答案,请参见。