表单组件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
表单组件
表单组件允许您轻松地创建、处理和重用形式。
表单组件是一个工具来帮助您解决问题,允许终端用户与应用程序的数据和修改数据。尽管传统上这是通过HTML表单组件集中处理数据从客户端和应用程序,这些数据是否被从一个正常的形式或从一个API。
安装
1
美元作曲家需要symfony /形式ob娱乐下载
或者,您可以克隆的https://github.com/ob娱乐下载symfony/form存储库。
请注意
如果你安装这个组件之外的Symfony应用程序,你必须要求ob娱乐下载供应商/ autoload.php
文件在你的代码,使作曲家提供的类加载机制。读这篇文章为更多的细节。
配置
另请参阅
这篇文章解释了如何使用表单功能作为一个独立的组件在任何PHP应用程序。读了形式文章在Symfony应用程序了解如何使用它。ob娱乐下载
在Syob娱乐下载mfony中,形式为对象,这些对象通过使用形式的工厂。建立一种工厂很简单:
1 2 3
使用ob娱乐下载\组件\形式\形式;美元formFactory=形式::createFormFactory ();
这个工厂已经可以用于创建基本形式,但它缺乏支持非常重要的特点:
- 请求处理:支持请求处理和文件上传;
- CSRF保护:支持保护跨站请求伪造(CSRF)攻击;
- 模板:与模板的集成层,允许重用HTML片段在呈现一种形式;
- 翻译:支持翻译错误消息,字段标签和其他字符串;
- 验证:集成验证库为提交的数据生成错误消息。
Symfob娱乐下载ony的表单组件依赖于其他库来解决这些问题。大部分的时间你会用树枝和Symfonyob娱乐下载HttpFoundation、翻译和验证器组件,但是你可以取代这些不同图书馆的你的选择。
下面的小节解释如何将这些库插入到工厂。
提示
请求处理
2.3
的handleRequest ()
方法是在Symfony 2.3中引入的。ob娱乐下载
处理表单数据,您将需要调用handleRequest ()方法:
1
美元形式- >handleRequest ();
在幕后,这使用了NativeRequestHandler对象读取数据的正确的PHP已经(即。$ _POST
或$ _GET
基于表单上的HTTP方法配置(默认)。
另请参阅
如果你需要更多的控制什么时候提交表单或数据传递给它,您可以使用提交()对于这个。阅读更多关于它如何使用submit()函数来处理表单提交。
与HttpFoundation组件集成
如果你使用HttpFoundation组件,那么你应该添加HttpFoundationExtension你的工厂形式:
1 2 3 4 5 6
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\组件\形式\扩展\HttpFoundation\HttpFoundationExtension;美元formFactory=形式::createFormFactoryBuilder ()- >addExtension (新HttpFoundationExtension ())- >getFormFactory ();
现在,当你处理一个表单,您可以通过请求对象handleRequest ():
1
美元形式- >handleRequest (美元请求);
请注意
为更多的信息关于HttpFoundation组件或如何安装它,明白了HttpFoundation组件。
CSRF保护
抵御CSRF攻击是表单组件,但是你需要显式地启用它或把它换成一个定制的解决方案。如果你想使用内置的支持,首先安装安全CSRF组件:
1
美元作曲家需要symfony / seob娱乐下载curity-csrf
以下代码片段添加CSRF保护形式工厂:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\组件\HttpFoundation\会话\会话;使用ob娱乐下载\组件\形式\扩展\Csrf\CsrfExtension;使用ob娱乐下载\组件\安全\Csrf\TokenStorage\SessionTokenStorage;使用ob娱乐下载\组件\安全\Csrf\TokenGenerator\UriSafeTokenGenerator;使用ob娱乐下载\组件\安全\Csrf\CsrfTokenManager;/ /创建一个会话对象从HttpFoundation组件美元会话=新会话();美元csrfGenerator=新UriSafeTokenGenerator ();美元csrfStorage=新SessionTokenStorage (美元会话);美元csrfManager=新CsrfTokenManager (美元csrfGenerator,美元csrfStorage);美元formFactory=形式::createFormFactoryBuilder ()/ /……- >addExtension (新CsrfExtension (美元csrfManager))- >getFormFactory ();
在内部,该扩展将自动隐藏字段添加到每个表单(称为_token
默认情况下),其价值是由CSRF生成器自动生成和验证当绑定表单。
提示
如果你不使用HttpFoundation组件,您可以使用NativeSessionTokenStorage相反,它依赖于PHP的原生会话处理:
1 2 3 4
使用ob娱乐下载\组件\安全\Csrf\TokenStorage\NativeSessionTokenStorage;美元csrfStorage=新NativeSessionTokenStorage ();/ /……
你可以禁用每个表单使用CSRF保护csrf_protection
选择:
1 2 3 4
使用ob娱乐下载\ \组件\ \形式\ \扩展\ \核心\ \类型\ \FormType美元形式= $formFactory- >createBuilder(FormType::类,零,['csrf_protection' = >假)- >getForm();
树枝模板
如果你使用表单组件处理HTML表单,你会很容易需要一种方法来呈现表单作为HTML表单字段(字段值,错误,和标签)。如果你使用嫩枝当你的模板引擎,表单组件提供了一个丰富的集成。
使用集成,你需要树枝大桥,树枝和一些Symfony之间提供集成组件:ob娱乐下载
1
美元作曲家需要symfony / twob娱乐下载ig-bridge
TwigBridge集成提供了几个树枝的功能帮助你呈现HTML小部件,标签和错误每个字段(以及一些其他的事情)。配置集成,你需要引导或访问树枝和添加FormExtension:
1 2 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 31 32 33 34 35 36 37
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\桥\嫩枝\扩展\FormExtension;使用ob娱乐下载\桥\嫩枝\形式\TwigRenderer;使用ob娱乐下载\桥\嫩枝\形式\TwigRendererEngine;使用嫩枝\环境;使用嫩枝\加载程序\FilesystemLoader;/ /持有所有的树枝文件的默认标记呈现形式/ /这个文件TwigBridge美元defaultFormTheme=“form_div_layout.html.twig”;美元vendorDirectory= realpath (__DIR__。“/ . . /供应商”);/ /路径TwigBridge图书馆所以树枝可以定位/ / form_div_layout.html。树枝文件美元appVariableReflection=新\ ReflectionClass (“桥ob娱乐下载\ Symfony \ \树枝\ AppVariable”);美元vendorTwigBridgeDirectory=目录名(美元appVariableReflection- >getFileName ());/ /你的其他模板的路径美元viewsDirectory= realpath (__DIR__。“/ . . /视图”);美元嫩枝=新环境(新FilesystemLoader (数组(美元viewsDirectory,美元vendorTwigBridgeDirectory。“/资源/视图/形式”)));美元formEngine=新TwigRendererEngine (数组(美元defaultFormTheme));美元formEngine- >setEnvironment (美元嫩枝);/ /……(有关更多信息,请参见前面的CSRF保护部分)/ /添加FormExtension树枝美元嫩枝- >addExtension (新FormExtension (新TwigRenderer (美元formEngine,美元csrfManager)));/ /创建一个工厂美元formFactory=形式::createFormFactoryBuilder ()/ /……- >getFormFactory ();
你的具体细节树枝配置会有所不同,但目标是总是添加吗FormExtension嫩枝,可以让你接触树枝函数呈现形式。要做到这一点,首先需要创建一个TwigRendererEngine,你定义你形式的主题(即资源/文件定义HTML标记)。
对于一般的细节呈现形式,明白了如何自定义形式呈现。
请注意
如果你使用树枝集成,读作“表单组件“下面的细节需要翻译过滤器。
翻译
如果你用树枝融入主题文件默认表单(如之一。form_div_layout.html.twig
),有两个树枝过滤器(反式
和transChoice
)标签,用于翻译形式错误,选择文本和其他字符串。
添加这些树枝过滤器,您可以使用内置的TranslationExtensionSymfony的翻译集成组件,或添加2枝过ob娱乐下载滤器自己,通过自己的树枝扩展。
使用内置的集成,确保您的项目已Symfony的翻译ob娱乐下载配置组件安装:
1
美元作曲家翻译需要symfony / ob娱乐下载symfony /配置
接下来,添加TranslationExtension到你的树枝\ \环境
实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\组件\翻译\翻译;使用ob娱乐下载\组件\翻译\加载程序\XliffFileLoader;使用ob娱乐下载\桥\嫩枝\扩展\TranslationExtension;/ /创建翻译美元翻译=新翻译(“en”);/ /加载一些翻译美元翻译- >addLoader (“xlf”,新XliffFileLoader ());美元翻译- >addResource (“xlf”,__DIR__。“/道路/ /翻译/ messages.en.xlf”,“en”);/ /添加TranslationExtension(给我们反式和transChoice过滤器)美元嫩枝- >addExtension (新TranslationExtension (美元翻译));美元formFactory=形式::createFormFactoryBuilder ()/ /……- >getFormFactory ();
根据您的翻译正在加载,您现在可以添加字符串键,如字段标签和他们的翻译给你翻译文件。
翻译的更多细节,请参阅翻译。
验证
表单组件带有紧(但可选)与Symfony的验证器组件的集成。ob娱乐下载如果您正在使用一个不同的解决方案验证,没有问题!简单的表单的提交/绑定数据(这是一个数组或对象)和通过自己的验证系统。
使用Symfony的验证器组件的集成,首先确保它是安装在ob娱乐下载您的应用程序:
1
美元作曲家需要symfony /验证器ob娱乐下载
如果你不熟悉Symfony的验证器组件,阅读更多关于它:ob娱乐下载验证。有一个表单组件ValidatorExtension类,它自动验证适用于您的数据绑定。这些错误然后映射到正确的领域和呈现。
集成与验证组件将会看起来像这样:
1 2 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
使用ob娱乐下载\组件\形式\形式;使用ob娱乐下载\组件\形式\扩展\验证器\ValidatorExtension;使用ob娱乐下载\组件\验证器\验证;美元vendorDirectory= realpath (__DIR__。“/ . . /供应商”);美元vendorFormDirectory=美元vendorDirectory。“/ob娱乐下载 symfony /形式”;美元vendorValidatorDirectory=美元vendorDirectory。“/ob娱乐下载 symfony /验证器”;/ /创建一个验证器,细节会有所不同美元验证器=验证::createValidator ();/ /核心有内置翻译错误消息美元翻译- >addResource (“xlf”,美元vendorFormDirectory。' /资源/翻译/ validators.en.xlf ',“en”,“验证”);美元翻译- >addResource (“xlf”,美元vendorValidatorDirectory。' /资源/翻译/ validators.en.xlf ',“en”,“验证”);美元formFactory=形式::createFormFactoryBuilder ()/ /……- >addExtension (新ValidatorExtension (美元验证器))- >getFormFactory ();
为了了解更多,跳过了表单组件部分。
访问表单工厂
应用程序只需要一种形式的工厂,一个工厂对象应该用于在应用程序中创建所有表单对象。这意味着您应该创建一些中央,引导您的应用程序,然后访问它的一部分,每当你需要建立一个形式。
请注意
在本文档中,表单工厂总是一个局部变量formFactory美元
。需要指出的是,您可能需要创建这个对象在一些更“全球”的方式,这样你就可以从任何地方访问它。
你是如何获得你的厂是一种形式。如果您正在使用一个服务容器(如提供的DependencyInjection组件),那么您应该将工厂的形式添加到您的容器,当你需要抓住它。如果您的应用程序使用全局或静态变量(通常不是一个好主意),那么您可以将对象存储在一些静态类或做类似的事情。
不管你如何应用程序架构师,只要记住,你应该只有一个工厂和形式,您需要在您的应用程序能够访问它。
创建一个简单的形式
提示
如果你使用Symfony框架,然后工厂形ob娱乐下载式可用自动作为服务调用form.factory
。同时,控制器类都有一个默认的基地createFormBuilder ()方法,该方法是一种捷径获取工厂和电话createBuilder ()
在上面。
创建一个表单是通过一个FormBuilder对象,构建和配置不同的领域。表单生成器创建的工厂。
- 独立使用
- 框架的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;/ /……美元形式=美元formFactory- >createBuilder ()- >add (“任务”,TextType::类)/ /如果使用PHP 5.3或5.4,您必须使用/ / - >添加(‘任务’,‘Syob娱乐下载mfony组件\ \ \ \ \核心类型的扩展形式\ TextType”)- >add (“dueDate”,DateType::类)- >getForm ();var_dump (美元嫩枝- >呈现(“new.html.twig”,数组(“形式”= >美元形式- >createView ())));
1 2 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
/ / src / Acme / TaskBundle /控制器/ DefaultController.php名称空间Acme\TaskBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;类DefaultController扩展控制器{公共函数newAction(请求美元请求){/ / createFormBuilder是一个快捷的“工厂”/ /然后调用“createBuilder ()”美元形式=美元这- >createFormBuilder ()- >add (“任务”,TextType::类)/ /如果使用PHP 5.3或5.4,您必须使用/ / - >添加(‘任务’,‘Syob娱乐下载mfony组件\ \ \ \ \核心类型的扩展形式\ TextType”)- >add (“dueDate”,DateType::类)- >getForm ();返回美元这- >呈现(“@AcmeTask /违约/ new.html.twig ',数组(“形式”= >美元形式- >createView ()));}}
正如你所看到的,创建一个形式就像写食谱:你的呼唤add ()
为每一个您想要创建的新领域。第一个参数为add ()
字段的名称,第二个是完全限定的类名。如果您使用PHP 5.5或更高版本,您可以使用::类
常数的一种类型。组件有很多形式内置类型。
设置默认值
如果你需要表单加载一些默认值(或者你正在构建一个“编辑”形式),仅仅通过在默认数据创建表单生成器时:
- 独立使用
- 框架的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用ob娱乐下载\组件\形式\扩展\核心\类型\FormType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;/ /……美元违约=数组(“dueDate”= >新\ DateTime (“明天”),);美元形式=美元formFactory- >createBuilder (FormType::类,美元违约)- >add (“任务”,TextType::类)- >add (“dueDate”,DateType::类)- >getForm ();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src / Acme / TaskBundle /控制器/ DefaultController.php名称空间Acme\TaskBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;类DefaultController扩展控制器{公共函数newAction(请求美元请求){美元违约=数组(“dueDate”= >新\ DateTime (“明天”),);美元形式=美元这- >createFormBuilder (美元违约)- >add (“任务”,TextType::类)- >add (“dueDate”,DateType::类)- >getForm ();/ /……}}
提示
在这个例子中,默认的数据是一个数组。之后,当你使用data_class选项来将数据直接绑定到对象,默认数据将该对象的一个实例。
呈现形式
既然已经创建了表单,下一步是呈现它。这样做是通过一种特殊的“视图”模板(注意对象$形式- > createView ()
在上面的控制器),使用一组表单辅助函数:
1 2 3 4 5
{{form_start(形式)}}{{form_widget(形式)}}<输入类型=“提交”/ >{{form_end(形式)}}
就是这样!通过印刷form_widget(形式)
每个字段的形式呈现,以及一个标签和错误消息(如果有的话)。像这是那么容易,不是非常灵活的(还)。通常情况下,你要单独渲染每个表单字段,这样你就可以控制形式的样子。你将学习如何在“如何控制呈现的一种形式吗”一节。
改变窗体的方法和行动
2.3
配置形式方法的能力和行动是在Symfony 2.3中引入的。ob娱乐下载
默认情况下,表单提交相同的URI的形式呈现一个HTTP POST请求。这种行为可以改变使用FormType领域和FormType领域选项(方法
选项也使用handleRequest ()
确定是否在表单被提交):
- 独立使用
- 框架的使用
1 2 3 4 5 6 7 8 9 10
使用ob娱乐下载\组件\形式\扩展\核心\类型\FormType;/ /……美元formBuilder=美元formFactory- >createBuilder (FormType::类,零,数组(“行动”= >“/搜索”,“方法”= >“得到”));/ /……
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src / Acme / TaskBundle /控制器/ DefaultController.php名称空间Acme\TaskBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\形式\扩展\核心\类型\FormType;类DefaultController扩展控制器{公共函数searchAction(){美元formBuilder=美元这- >createFormBuilder (零,数组(“行动”= >“/搜索”,“方法”= >“得到”));/ /……}}
处理表单提交
处理表单提交,可以使用handleRequest ()方法:
- 独立使用
- 框架的使用
1 2 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
使用ob娱乐下载\组件\HttpFoundation\请求;使用ob娱乐下载\组件\HttpFoundation\RedirectResponse;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;/ /……美元形式=美元formFactory- >createBuilder ()- >add (“任务”,TextType::类)- >add (“dueDate”,DateType::类)- >getForm ();美元请求=请求::createFromGlobals ();美元形式- >handleRequest (美元请求);如果(美元形式- >isSubmitted () & &美元形式- >isValid ()) {美元数据=美元形式- >getData ();/ /……执行一些操作,例如将数据保存到数据库中美元响应=新RedirectResponse (“成功/任务/”);美元响应- >准备(美元请求);返回美元响应- >send ();}/ /……
1 2 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
/ / src / Acme / TaskBundle /控制器/ DefaultController.php名称空间Acme\TaskBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;类DefaultController扩展控制器{公共函数newAction(请求美元请求){美元形式=美元这- >createFormBuilder ()- >add (“任务”,TextType::类)- >add (“dueDate”,DateType::类)- >getForm ();美元形式- >handleRequest (美元请求);如果(美元形式- >isSubmitted () & &美元形式- >isValid ()) {美元数据=美元形式- >getData ();/ /……执行一些操作,例如将数据保存到数据库中返回美元这- >redirectToRoute (“task_success”);}/ /……}}
这定义了一个常见“工作流”,它包含三种不同的可能性:
- 在最初的GET请求(例如,当用户“冲浪”页面),构建形式和呈现;
如果请求是一个岗位,过程(通过提交的数据handleRequest ()
)。然后:
- 如果表单无效,重新呈现形式(现在将包含错误);
- 如果表单有效,执行一些动作和重定向。
幸运的是,你不需要决定是否提交了一种形式。将当前请求传递给handleRequest ()
方法。然后,表单组件将为你做所有必要的工作。
表单验证
最简单的方式向表单添加验证通过约束
选择在构建每个字段:
- 独立使用
- 框架的使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载\组件\验证器\约束\NotBlank;使用ob娱乐下载\组件\验证器\约束\类型;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;美元形式=美元formFactory- >createBuilder ()- >add (“任务”,TextType::类,数组(“约束”= >新NotBlank ()))- >add (“dueDate”,DateType::类,数组(“约束”= >数组(新NotBlank (),新(\ DateTime类型::类))))- >getForm ();
1 2 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
/ / src / Acme / TaskBundle /控制器/ DefaultController.php名称空间Acme\TaskBundle\控制器;使用ob娱乐下载\包\FrameworkBundle\控制器\控制器;使用ob娱乐下载\组件\验证器\约束\NotBlank;使用ob娱乐下载\组件\验证器\约束\类型;使用ob娱乐下载\组件\形式\扩展\核心\类型\DateType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;类DefaultController扩展控制器{公共函数newAction(请求美元请求){美元形式=美元这- >createFormBuilder ()- >add (“任务”,TextType::类,数组(“约束”= >新NotBlank ()))- >add (“dueDate”,DateType::类,数组(“约束”= >数组(新NotBlank (),新(\ DateTime类型::类))))- >getForm ();/ /……}}
当表单绑定,这些验证约束将自动应用和旁边的错误会显示字段错误。
请注意
所有的内置的验证约束,明白了验证约束参考。
访问形式错误
您可以使用getErrors ()错误的方法来访问列表。它返回一个FormErrorIterator实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
美元形式=……;/ /……/ / FormErrorIterator实例,但只有附加到这个错误/ /表单水平(如全局错误)美元错误=美元形式- >getErrors ();/ / FormErrorIterator实例,但只有附加到错误/ /“firstName”字段美元错误=美元形式(“firstName”]- >getErrors ();/ / FormErrorIterator实例在一个扁平结构/ /使用getOrigin()来确定导致错误的形式美元错误=美元形式- >getErrors (真正的);/ / FormErrorIterator实例树结构表示形式美元错误=美元形式- >getErrors (真正的,假);
提示
在年长的Symfoob娱乐下载ny的版本中,getErrors ()
返回一个数组。使用同样的错误在Symfony 2.5或更新版本,你必须通过PHP的ob娱乐下载iterator_to_array功能:
1
美元errorsAsArray= iterator_to_array (美元形式- >getErrors ());
这是有用的,例如,如果您想要使用PHP的array_ * ()
函数形式错误。
了解更多
- 如何改变一个表单的动作和方法
- 如何选择基于验证组点击按钮
- 如何创建一个自定义表单字段类型
- 如何创建一个表单类型扩展
- 如何实现CSRF保护吗
- 如何选择基于验证组提交的数据
- 如何使用数据变形金刚吗
- 如何使用submit()函数来处理表单提交
- 如何禁用验证提交的数据
- 如何使用表单动态修改表单事件吗
- 如何嵌入形式
- 形成事件
- 如何嵌入一组形式
- 如何自定义形式呈现
- 如何访问服务或配置从一种形式吗
- 如何处理形式的主题
- 如何减少代码重复“inherit_data”
- 如何与多个按钮提交表单吗
- 如何控制呈现的一种形式吗
- 创建一个自定义类型猜测者
- 单元测试你的形式如何
- 如何配置空数据形式类
- 如何使用虚拟表单字段选择吗
- 如何动态地配置表单验证组吗
- 如何定义验证组使用
- 没有一个数据类如何使用一种形式