形成事件
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
形成事件
表单组件提供了一个结构化的过程,使您可以通过使用EventDispatcher组件.使用表单事件,您可以在工作流的不同步骤中修改信息或字段:从填充表单到从请求提交数据。
例如,如果需要根据请求值添加字段,则可以将事件侦听器注册到FormEvents: PRE_SUBMIT
事件如下:
12 3 4 5 6 7 8 9 10 11 12 13 14
/ /……使用ob娱乐下载\组件\形式\FormEvent;使用ob娱乐下载\组件\形式\FormEvents;$侦听器=函数(FormEvent$事件){/ /……};$形式=$formFactory->createBuilder ()/ /……添加表单字段->addEventListener (FormEvents::PRE_SUBMIT,$侦听器);/ /……
表单工作流程
1)预填表格(FormEvents: PRE_SET_DATA
而且FormEvents: POST_SET_DATA
)
在表单预填充期间,有两个事件被分派形式::setData ()被称为:FormEvents: PRE_SET_DATA
而且FormEvents: POST_SET_DATA
.
一个)FormEvents: PRE_SET_DATA
事件
的FormEvents: PRE_SET_DATA
事件的开始时分派形式::setData ()
方法。它可用于:
- 修改预填充期间给出的数据;
- 根据预填充的数据修改表单(动态添加或删除字段)。
数据类型 | 价值 |
---|---|
模型数据 | 零 |
规范化数据 | 零 |
视图数据 | 零 |
另请参阅
中查看所有表单事件表单事件信息表.
谨慎
在FormEvents: PRE_SET_DATA
,形式::setData ()锁定,如果使用将抛出异常。如果您希望修改数据,您应该使用FormEvent: setData ()代替。
FormEvents: PRE_SET_DATA
在Form组件中
的ob娱乐下载
类型依赖于ob娱乐下载
订阅者,正在收听FormEvents: PRE_SET_DATA
事件,以便通过删除和添加所有表单行,根据来自预填充对象的数据重新排列表单字段。
B)FormEvents: POST_SET_DATA
事件
的FormEvents: POST_SET_DATA
事件的末尾发送形式::setData ()方法。此事件主要用于在预填充表单之后读取数据。
数据类型 | 价值 |
---|---|
模型数据 | 模型数据注入setData () |
规范化数据 | 使用模型转换器转换的模型数据 |
视图数据 | 使用视图转换器转换的规范化数据 |
另请参阅
中查看所有表单事件表单事件信息表.
FormEvents: POST_SET_DATA
在Form组件中
的ob娱乐下载
类是订阅侦听的FormEvents: POST_SET_DATA
事件,以便从非规范化模型和视图数据中收集有关表单的信息。
2)递交表格(FormEvents: PRE_SUBMIT
,FormEvents:提交
而且FormEvents: POST_SUBMIT
)
时将分派三个事件形式:handleRequest ()或形式::提交()被称为:FormEvents: PRE_SUBMIT
,FormEvents:提交
,FormEvents: POST_SUBMIT
.
一个)FormEvents: PRE_SUBMIT
事件
的FormEvents: PRE_SUBMIT
事件的开始时分派形式::提交()方法。
它可用于:
- 在向表单提交数据之前,更改请求中的数据;
- 在向表单提交数据之前,添加或删除表单字段。
数据类型 | 价值 |
---|---|
模型数据 | 和在FormEvents: POST_SET_DATA |
规范化数据 | 和在FormEvents: POST_SET_DATA |
视图数据 | 和在FormEvents: POST_SET_DATA |
另请参阅
中查看所有表单事件表单事件信息表.
FormEvents: PRE_SUBMIT
在Form组件中
的ob娱乐下载
订阅者订阅FormEvents: PRE_SUBMIT
事件,以便修剪请求的数据(用于字符串值)。的ob娱乐下载
订阅者订阅FormEvents: PRE_SUBMIT
事件,以验证CSRF令牌。
B)FormEvents:提交
事件
的FormEvents:提交
事件在形式::提交()方法将规范化数据转换回模型和视图数据。
它可用于从数据的规范化表示中更改数据。
数据类型 | 价值 |
---|---|
模型数据 | 和在FormEvents: POST_SET_DATA |
规范化数据 | 使用视图转换器对来自请求的数据进行反向转换 |
视图数据 | 和在FormEvents: POST_SET_DATA |
另请参阅
中查看所有表单事件表单事件信息表.
谨慎
此时,您不能向表单添加或删除字段。
FormEvents:提交
在Form组件中
的ob娱乐下载
订阅FormEvents:提交
事件,以便在没有协议提交的URL字段中预先添加默认协议。
C)FormEvents: POST_SUBMIT
事件
的FormEvents: POST_SUBMIT
事件之后将被分派形式::提交()一旦模型和视图数据被非规格化。
它可以用来取回非规格化后的数据。
数据类型 | 价值 |
---|---|
模型数据 | 使用模型转换器反向转换规范化数据 |
规范化数据 | 和在FormEvents:提交 |
视图数据 | 使用视图转换器转换的规范化数据 |
另请参阅
中查看所有表单事件表单事件信息表.
谨慎
此时,您不能向当前表单及其子表单添加或删除字段。
FormEvents: POST_SUBMIT
在Form组件中
的ob娱乐下载
订阅FormEvents: POST_SUBMIT
事件,以便收集有关表单的信息。的ob娱乐下载
订阅FormEvents: POST_SUBMIT
事件,以便自动验证非规格化对象。
注册事件监听器或事件订阅者
为了能够使用Form事件,您需要创建事件侦听器或事件订阅器,并将其注册到事件。
控件上的一个常量定义了每个“表单”事件的名称FormEvents类。此外,每个事件回调(侦听器或订阅者方法)都传递一个参数,该参数是的实例FormEvent.事件对象包含对表单当前状态和正在处理的当前数据的引用。
的名字 | FormEvents 常数 |
事件的数据 |
---|---|---|
form.pre_set_data |
FormEvents: PRE_SET_DATA |
模型数据 |
form.post_set_data |
FormEvents: POST_SET_DATA |
模型数据 |
form.pre_submit |
FormEvents: PRE_SUBMIT |
请求数据 |
form.submit |
FormEvents:提交 |
规范化数据 |
form.post_submit |
FormEvents: POST_SUBMIT |
视图数据 |
事件监听器
事件监听器可以是任何类型的有效可调用对象。类型的内联事件侦听器函数addEventListener
方法FormFactory
:
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 31 32
/ /……使用ob娱乐下载\组件\形式\扩展\核心\类型\CheckboxType;使用ob娱乐下载\组件\形式\扩展\核心\类型\EmailType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\FormEvent;使用ob娱乐下载\组件\形式\FormEvents;$形式=$formFactory->createBuilder ()->add (“用户名”, TextType::类)->add (“showEmail”, CheckboxType::类)->addEventListener (FormEvents::PRE_SUBMIT,函数(FormEvent$事件){$用户=$事件->getData ();$形式=$事件->getForm ();如果(!$用户){返回;}//检查用户是否选择显示他们的电子邮件。//如果数据是以前提交的,则为//包含在请求变量中的变量需要被删除。如果(收取($用户[“showEmail”) & &$用户[“showEmail”) {$形式->add (“电子邮件”, EmailType::类);}其他的{设置($用户[“电子邮件”]);$事件->setData ($用户);}})->getForm ();/ /……
当你创建了一个表单类型类,你可以使用它的一个方法作为回调,以获得更好的可读性:
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
/ / src /形式/ SubscriptionType.php名称空间应用程序\形式;使用ob娱乐下载\组件\形式\扩展\核心\类型\CheckboxType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;使用ob娱乐下载\组件\形式\FormEvent;使用ob娱乐下载\组件\形式\FormEvents;/ /……类SubscriptionType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项):无效{$构建器->add (“用户名”, TextType::类)->add (“showEmail”, CheckboxType::类)->addEventListener (FormEvents::PRE_SET_DATA, ($这,“onPreSetData”]);}公共函数onPreSetData(FormEvent$事件):无效{/ /……}}
事件订阅者
事件订阅者有不同的用途:
- 改善可读性;
- 倾听多个事件;
- 在单个类中重新组合多个侦听器。
考虑以下表单事件订阅者的例子:
12 34 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 38 39 40 41 42 43 44 45 46 47 48 49 50
/ / src /形式/ EventListener / AddEmailFieldListener.php名称空间应用程序\形式\EventListener;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;使用ob娱乐下载\组件\形式\扩展\核心\类型\EmailType;使用ob娱乐下载\组件\形式\FormEvent;使用ob娱乐下载\组件\形式\FormEvents;类AddEmailFieldListener实现了EventSubscriberInterface{公共静态函数getSubscribedEvents():数组{返回[FormEvents::PRE_SET_DATA = >“onPreSetData”, FormEvents::PRE_SUBMIT = >“onPreSubmit”,);}公共函数onPreSetData(FormEvent$事件):无效{$用户=$事件->getData ();$形式=$事件->getForm ();//检查用户是否从初始数据中选择了//是否显示他们的电子邮件。如果(真正的===$用户->isShowEmail ()) {$形式->add (“电子邮件”, EmailType::类);}}公共函数onPreSubmit(FormEvent$事件):无效{$用户=$事件->getData ();$形式=$事件->getForm ();如果(!$用户){返回;}//检查用户是否选择显示他们的电子邮件。//如果数据是以前提交的,则为//包含在需要删除的请求变量中。如果(收取($用户[“showEmail”) & &$用户[“showEmail”) {$形式->add (“电子邮件”, EmailType::类);}其他的{设置($用户[“电子邮件”]);$事件->setData ($用户);}}}
要注册事件订阅者,请使用addEventSubscriber ()
方法:
12 3 4 5 6 7 8 9 10 11 12 13
使用应用程序\形式\EventListener\AddEmailFieldListener;使用ob娱乐下载\组件\形式\扩展\核心\类型\CheckboxType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;/ /……$形式=$formFactory->createBuilder ()->add (“用户名”, TextType::类)->add (“showEmail”, CheckboxType::类)->addEventSubscriber (新AddEmailFieldListener ())->getForm ();/ /……