形成事件

编辑本页

警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,现已不再维护。

本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。

形成事件

表单组件提供了一个结构化的过程,使您可以通过使用EventDispatcher组件.使用表单事件,您可以在工作流的不同步骤中修改信息或字段:从填充表单到从请求提交数据。

例如,如果需要根据请求值添加字段,则可以将事件侦听器注册到FormEvents: PRE_SUBMIT事件如下:

12 3 4 5 6 7 8 9 10 11 12 13 14
/ /……使用欧宝娱乐app下载地址组件形式FormEvent使用欧宝娱乐app下载地址组件形式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 ()代替。

欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\ CollectionType类型依赖于欧宝娱乐app下载地址\组件\形式\扩展\核心\ EventListener\ ResizeFormListener订阅者,正在收听FormEvents: PRE_SET_DATA事件,以便通过删除和添加所有表单行,根据来自预填充对象的数据重新排列表单字段。

B)FormEvents: POST_SET_DATA事件

FormEvents: POST_SET_DATA事件的末尾发送形式::setData ()方法。此事件主要用于在预填充表单之后读取数据。

数据类型 价值
模型数据 模型数据注入setData ()
规范化数据 使用模型转换器转换的模型数据
视图数据 使用视图转换器转换的规范化数据

另请参阅

中查看所有表单事件表单事件信息表

欧宝娱乐app下载地址\组件\形式\扩展\ DataCollector\ EventListener\ DataCollectorListener类是订阅侦听的FormEvents: POST_SET_DATA事件,以便从非规范化模型和视图数据中收集有关表单的信息。

2)递交表格(FormEvents: PRE_SUBMITFormEvents:提交而且FormEvents: POST_SUBMIT

时将分派三个事件形式:handleRequest ()形式::提交()被称为:FormEvents: PRE_SUBMITFormEvents:提交FormEvents: POST_SUBMIT

一个)FormEvents: PRE_SUBMIT事件

FormEvents: PRE_SUBMIT事件的开始时分派形式::提交()方法。

它可用于:

  • 在向表单提交数据之前,更改请求中的数据;
  • 在向表单提交数据之前,添加或删除表单字段。
数据类型 价值
模型数据 和在FormEvents: POST_SET_DATA
规范化数据 和在FormEvents: POST_SET_DATA
视图数据 和在FormEvents: POST_SET_DATA

另请参阅

中查看所有表单事件表单事件信息表

欧宝娱乐app下载地址\组件\形式\扩展\核心\ EventListener\ TrimListener订阅者订阅FormEvents: PRE_SUBMIT事件,以便修剪请求的数据(用于字符串值)。的欧宝娱乐app下载地址\组件\形式\扩展\ Csrf\ EventListener\ CsrfValidationListener订阅者订阅FormEvents: PRE_SUBMIT事件,以验证CSRF令牌。

B)FormEvents:提交事件

FormEvents:提交事件在形式::提交()方法将规范化数据转换回模型和视图数据。

它可用于从数据的规范化表示中更改数据。

数据类型 价值
模型数据 和在FormEvents: POST_SET_DATA
规范化数据 使用视图转换器对来自请求的数据进行反向转换
视图数据 和在FormEvents: POST_SET_DATA

另请参阅

中查看所有表单事件表单事件信息表

谨慎

此时,您不能向表单添加或删除字段。

欧宝娱乐app下载地址\组件\形式\扩展\核心\ EventListener\ FixUrlProtocolListener订阅FormEvents:提交事件,以便在没有协议提交的URL字段中预先添加默认协议。

C)FormEvents: POST_SUBMIT事件

FormEvents: POST_SUBMIT事件之后将被分派形式::提交()一旦模型和视图数据被非规格化。

它可以用来取回非规格化后的数据。

数据类型 价值
模型数据 使用模型转换器反向转换规范化数据
规范化数据 和在FormEvents:提交
视图数据 使用视图转换器转换的规范化数据

另请参阅

中查看所有表单事件表单事件信息表

谨慎

此时,您不能向当前表单及其子表单添加或删除字段。

欧宝娱乐app下载地址\组件\形式\扩展\ DataCollector\ EventListener\ DataCollectorListener订阅FormEvents: POST_SUBMIT事件,以便收集有关表单的信息。的欧宝娱乐app下载地址\组件\形式\扩展\验证器\ EventListener\ ValidationListener订阅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
/ /……使用欧宝娱乐app下载地址组件形式扩展核心类型CheckboxType使用欧宝娱乐app下载地址组件形式扩展核心类型EmailType使用欧宝娱乐app下载地址组件形式扩展核心类型TextType使用欧宝娱乐app下载地址组件形式FormEvent使用欧宝娱乐app下载地址组件形式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名称空间应用程序形式使用欧宝娱乐app下载地址组件形式扩展核心类型CheckboxType使用欧宝娱乐app下载地址组件形式扩展核心类型TextType使用欧宝娱乐app下载地址组件形式FormEvent使用欧宝娱乐app下载地址组件形式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使用欧宝娱乐app下载地址组件EventDispatcherEventSubscriberInterface使用欧宝娱乐app下载地址组件形式扩展核心类型EmailType使用欧宝娱乐app下载地址组件形式FormEvent使用欧宝娱乐app下载地址组件形式FormEventsAddEmailFieldListener实现了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
使用应用程序形式EventListenerAddEmailFieldListener使用欧宝娱乐app下载地址组件形式扩展核心类型CheckboxType使用欧宝娱乐app下载地址组件形式扩展核心类型TextType/ /……形式formFactory->createBuilder ()->add (“用户名”, TextType::类)->add (“showEmail”, CheckboxType::类)->addEventSubscriber (AddEmailFieldListener ())->getForm ();/ /……
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。