如何使用没有数据类的表单
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
如何使用没有数据类的表单
在大多数情况下,表单被绑定到一个对象,表单的字段在该对象的属性上获取并存储它们的数据。这正是到目前为止您在本文中看到的任务
类。
但有时,您可能希望使用不带类的表单,并返回提交数据的数组。的getData ()
方法可以让你做到这一点:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
/ / src /控制器/ ContactController.php名称空间应用程序\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\HttpFoundation\响应;/ /……类ContactController扩展AbstractController{公共函数联系(请求$请求):响应{$defaultData= (“消息”= >“在这里输入您的信息”];$形式=$这->createFormBuilder ($defaultData)->add (“名字”, TextType::类)->add (“电子邮件”, EmailType::类)->add (“消息”, TextareaType::类)->add (“发送”, SubmitType::类)->getForm ();$形式->handleRequest ($请求);如果($形式->isSubmitted () & &$形式->isValid ()) {// data是一个包含"name", "email"和"message"键的数组$数据=$形式->getData ();}/ /……渲染表单}}
默认情况下,表单实际上假定您要处理数据数组,而不是对象。有两种方法可以改变这种行为并将表单绑定到对象上:
- 在创建表单时传递一个对象(作为
createFormBuilder ()
或者第二个参数createForm ()
); - 声明
data_class
表格上的选项。
如果你不执行其中任何一项操作,表单都将以数组的形式返回数据。在这个例子中,sincedefaultData美元
不是一个对象(而且不是data_class
选项已设置),形式- > getData ()
最终返回一个数组。
提示
你也可以直接通过请求对象访问POST值(在本例中是“name”),如下所示:
1
$请求->请求->get (“名字”);
但是,建议在大多数情况下使用getData ()
方法是更好的选择,因为它在Form组件转换数据后返回数据(通常是一个对象)。
添加验证
唯一缺少的部分是验证。通常是你打电话的时候形式- > handleRequest(请求)
,通过读取应用到该类的约束来验证对象。如果您的表单映射到一个对象(即您正在使用data_class
选项或向表单传递对象),这几乎总是您想要使用的方法。看到验证欲知详情。
但是,如果表单没有映射到对象,而希望检索提交数据的数组,那么如何向表单的数据添加约束呢?
答案是自己设置约束,并将它们附加到各个字段。本文对总体方法进行了更多的介绍验证文章,但这里有一个简短的例子:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TextType;使用欧宝娱乐app下载地址\组件\形式\FormBuilderInterface;使用欧宝娱乐app下载地址\组件\验证器\约束\长度;使用欧宝娱乐app下载地址\组件\验证器\约束\NotBlank;公共函数buildForm(FormBuilderInterface$构建器数组,$选项):无效{$构建器->add (“firstName”, TextType::类,“约束”= >新长度([“最小值”= >3.))))->add (“姓”, TextType::类,“约束”= > [新NotBlank (),新长度([“最小值”= >3.]),],]);}
提示
如果使用验证组,则需要引用默认的
在创建表单时进行分组,或者在您添加的约束上设置正确的组:
1
新NotBlank ([“组织”= > [“创建”,“更新”]]);
提示
方法对提交数据数组中的每个对象进行验证欧宝娱乐app下载地址
约束,除非你禁用验证.
谨慎
当表单只被部分提交时(例如,在HTTP PATCH请求中),只有来自已提交表单字段的约束将被评估。