我正在尝试使用以下代码创建一个表单:
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中,表单由对象表示,这些对象是使用表单工厂构建的。构建表单工厂很简单:这个工厂已经可以用来创建基本表单,但它缺乏对非常重要的功能的支持:
- 请求处理
- :支持请求处理和文件上传;
- CSRF 保护:支持防止跨站点请求伪造 (CSRF) 攻击; 模板
- :与模板层集成,允许您在呈现表单时重用 HTML 片段; 翻译
- :支持翻译错误消息、字段标签等字符串;验证:与验证库集成,为提交的数据生成错误消息。
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;
}