没有FormBuilder symfony2创建表单时出错

时间:2015-01-22 06:44:19

标签: php forms symfony

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

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();
}

第一种方法有什么问题?

1 个答案:

答案 0 :(得分:0)

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

  1. 请求处理:支持请求处理和文件上传;
  2. CSRF保护:支持防止跨站点请求伪造(CSRF)攻击;
  3. 模板化:与模板层集成,允许您在渲染表单时重用HTML片段;
  4. 翻译:支持翻译错误消息,字段标签和其他字符串; 验证:与验证库集成以生成提交数据的错误消息。
  5. 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;
    }