没有数据类如何使用一个表单

3.4 版本
维护中的版本

大多数情况下,一个表单要绑定一个对象的,并且表单中所有的字段获取或者保存它们的数据到该对象属性。

但有时候,你可能只想使用一个没有类的表单,返回一个提交数据的数组,这个非常容易实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// make sure you've imported the Request namespace above the class
use Symfony\Component\HttpFoundation\Request;
// ...
 
public function contactAction(Request $request)
{
    $defaultData = array('message' => 'Type your message here');
    $form = $this->createFormBuilder($defaultData)
        ->add('name', TextType::class)
        ->add('email', EmailType::class)
        ->add('message', TextareaType::class)
        ->add('send', SubmitType::class)
        ->getForm();
 
    $form->handleRequest($request);
 
    if ($form->isValid()) {
        // data is an array with "name", "email", and "message" keys
        $data = $form->getData();
    }
 
    // ... render the form
}

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

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

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

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

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

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

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

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

添加验证 

唯一遗漏的地方就是校验规则了,通常当你调用$form->isvalid()时,对象会调用你在类中提供的验证规则进行验证。如果你的表单被映射到一个对象(例如,你正在使用data_class配置或者对象作为参数传入到你的form),这些方法使用非常的勤。请参阅 Validation

但如果表单没有映射到一个对象,你要检索提交过来的一个简单数组,你怎么来添加对你表单数据的约束规则呢?

答案是自己创建约束,然后传入到表单。整体的描述在Validation章节,但是这里有一个简单的案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Form\Extension\Core\Type\TextType;
 
$builder
   ->add('firstName', TextType::class, array(
       'constraints' => new Length(array('min' => 3)),
   ))
   ->add('lastName', TextType::class, array(
       'constraints' => array(
           new NotBlank(),
           new Length(array('min' => 3)),
       ),
   ))
;

如果你使用验证组,你需要在创建表单时引用默认组,或者你要添加在约束中设置正确的组。

1
new NotBlank(array('groups' => array('create', 'update'))

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)