繁体   English   中英

在没有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

但是,我可以使用以下语法创建相同的表单(从技术上讲,这是不一样的,它添加了type 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. 模板化:与模板化层的集成,允许您在渲染表单时重用HTML片段;
  4. 翻译:支持翻译错误消息,字段标签和其他字符串; 验证:与验证库集成,以为提交的数据生成错误消息。

Symfony Form组件依靠其他库来解决这些问题。 大多数时候,您将使用Twig以及Symfony HttpFoundation,Translation和Validator组件,但是您可以将它们替换为您选择的其他库。

如果您使用的是Symfony框架,则表单工厂可以自动作为称为form.factory的服务使用。 另外,默认的基本控制器类具有createFormBuilder()方法,这是获取表单工厂并在其上调用createBuilder的快捷方式。

现在已经创建了表单,下一步就是呈现它。 这是通过将特殊的表单“视图”对象传递到模板(请注意上面的控制器中的$ 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM