在没有 FormBuilder symfony2 的情况下创建表单时出错


error in creating a Form without the FormBuilder symfony2

我正在尝试使用以下代码创建一个表单:

protected function getSearchForm(){
    return $this->getFormFactory()->create('number', null, array('label' => 'code',
        'required' => true,
    'constraints' => new NotBlank(),
        'compound' => true,
    ))
        ->add('submit', 'submit');
}

但是我收到此错误,该错误源于->add('submit', 'submit');

Expected argument of type "object, array or empty", "string" given

但是,我可以使用以下语法创建相同的表单(从技术上讲,它不一样,它添加了form类型的根形式。

protected function getSearchForm(){
    return $this->getFormFactory()->createBuilder()->add('code','number', array('label' => 'code',
        'required' => true,
    'constraints' => new NotBlank(),
    ))
        ->add('submit', 'submit')
        ->getForm();
}

第一种方法有什么问题?

在Symfony中,表单由对象表示,这些对象是使用表单工厂构建的。构建表单工厂很简单:这个工厂已经可以用来创建基本表单,但它缺乏对非常重要的功能的支持:

    请求处理
  1. :支持请求处理和文件上传;
  2. CSRF 保护:支持防止跨站点请求伪造 (CSRF) 攻击;
  3. 模板
  4. :与模板层集成,允许您在呈现表单时重用 HTML 片段;
  5. 翻译
  6. :支持翻译错误消息、字段标签等字符串;验证:与验证库集成,为提交的数据生成错误消息。

Symfony Form组件依赖于其他库来解决这些问题。大多数时候,你会使用Twig和Symfony HttpFoundation,翻译和验证器组件,但你可以用你选择的不同库替换其中任何一个。

如果您使用的是Symfony框架,那么表单工厂将自动作为名为form.factory的服务使用。此外,默认的基控制器类有一个createFormBuilder()方法,它是获取表单工厂并在其上调用createBuilder的快捷方式。

现在表单已创建,下一步是呈现它。这是通过将一个特殊的表单"view"对象传递给您的模板来完成的(请注意上面控制器中的$form->createView())并使用一组表单帮助程序函数:

阅读更多 : http://symfony.com/doc/current/components/form/introduction.html

结论:您必须调用createBuilder()来获取formFactory并且必须调用createView()才能将其呈现为模板。

我将使您的代码易于理解:

protected function getSearchForm(){
    $form = $this->getFormFactory()->create('number', null, array('label' => 'code',
        'required' => true,
    'constraints' => new NotBlank(),
        'compound' => true,
    ));
    $form->add('submit', 'submit');
    return $form;
}

正如您在上面的可读示例中所看到的,您在获取之前将一个字段添加到 formFactory 中。您应该先获取它,然后才能添加字段。

protected function getSearchForm(){
    $form = $this->getFormFactory()->createBuilder()->add('code','number', array('label' => 'code',
        'required' => true,
    'constraints' => new NotBlank(),
    ));
    $form->add('submit', 'submit')
        ->getForm();
    return $form;
}