Symfony2框架学习笔记之表单用法详解(8)

大多数情况下,一个表单要绑定一个对象的,并且表单中所有的字段获取或者保存它们的数据到该对象属性。但有时候,你可能只想使用一个没有类的表单,返回一个提交数据的数组,这个非常容易实现:

// 确认你在类上方导入了Request对象 use Symfony\Component\HttpFoundation\Request // ... public function contactAction(Request $request) { $defaultData = array('message' => 'Type your message here'); $form = $this->createFormBuilder($defaultData) ->add('name', 'text') ->add('email', 'email') ->add('message', 'textarea') ->getForm(); if ($request->getMethod() == 'POST') { $form->bindRequest($request); // 数据是一个数组并包含 "name", "email", 和"message" 键 $data = $form->getData(); } // ... 渲染表单 }

默认情况下,一个表单真的假设你想要一个数据数组而不是数据对象。

这里有两种方式你可以改变它的行为并绑定一个对象;

1.当创建表单时传入一个对象(作为createFormBuilder的第一个参数或者createForm的第二个参数)。

2.在你的表单中声明data_class 选项

如果以上两种方式都没有,那么表单会返回一个数组数据。在这个示例中因为$defaultData不是一个对象,又没有设置data_class选项,则$form->getData()最终返回一个数组。

你也可以通过Request对象直接访问POST的值,

$this->get('request')->request->get('name');

注意,大多数的情况下我们使用getData()方法是更好一点的选择。因为它返回的是经过表单框架转换过的数据。

添加校验规则

唯一遗漏的地方就是校验规则了,通常当你调用$form->isvalid()时,对象会调用你在类东提供的校验规则进行校验。但如果没有类,你怎么来添加对你表单数据的约束规则呢?答案是自己创建约束,然后传入到表单。

// 在controller类前导入命名空间 use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\MinLength; use Symfony\Component\Validator\Constraints\Collection; $collectionConstraint = new Collection(array( 'name' => new MinLength(5), 'email' => new Email(array('message' => 'Invalid email address')), )); // 创建一个表单没有默认值,传入约束选项。 $form = $this->createFormBuilder(null, array( 'validation_constraint' => $collectionConstraint, ))->add('email', 'email') // ... ;

现在,当你调用$form->bindRequest($request)时,约束就会被创建并作用于你的表单数据。如果你使用表单类,重写getDefaultOptions 方法来指定可选项:

namespace Acme\TaskBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilder; use Symfony\Component\Validator\Constraints\Email; use Symfony\Component\Validator\Constraints\MinLength; use Symfony\Component\Validator\Constraints\Collection; class ContactType extends AbstractType { // ... public function getDefaultOptions(array $options) { $collectionConstraint = new Collection(array( 'name' => new MinLength(5), 'email' => new Email(array('message' => 'Invalid email address')), )); return array('validation_constraint' => $collectionConstraint); } }

这样你有了足够的灵活性来创建表单类和约束了,它返回一个数据数组而不是一个对象。大多数情况下,这个是不错的,而绑定一个表单到一个对象,从某种程度上说更加健壮。对于简单表单来说是个不错的选择。

总结思考

你现在已经了解了所有建造复杂功能性的表单所需要的所有建造块。当生成表单时,记住一个表单的首要目标是从一个对象把数据传递给一个HTML表单以方便用户修改它们。第二个目标就是把用户提交的数据重写提交回对象。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/92c5f09968c3c828156dc572610ddac4.html