我正在尝试使用以下代码创建表单:
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();
}
第一种方法有什么问题?
答案 0 :(得分:0)
在Symfony中,表单由对象表示,这些对象是使用表单工厂构建的。构建表单工厂很简单:这个工厂已经可以用来创建基本表单了,但它缺乏对非常重要的功能的支持:
Symfony Form组件依赖于其他库来解决这些问题。大多数情况下,您将使用Twig和Symfony HttpFoundation,Translation和Validator组件,但您可以使用您选择的不同库替换其中任何一个。
如果您正在使用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;
}