没有数据类如何使用一个表单
大多数情况下,一个表单要绑定一个对象的,并且表单中所有的字段获取或者保存它们的数据到该对象属性。
但有时候,你可能只想使用一个没有类的表单,返回一个提交数据的数组,这个非常容易实现:
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
} |
默认情况下,一个表单真的假设你想要一个数据数组而不是数据对象。
这里有两种方式你可以改变它的行为并绑定一个对象;
当创建表单时传入一个对象(作为
createFormBuilder
的第一个参数或者createForm
的第二个参数)。在你的表单中声明
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')) |