形成事件

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

形成事件

表单组件提供一个结构化的过程让你定制你的形式,利用的EventDispatcher组件。使用表单事件,您可以修改信息或字段在不同工作流的步骤:从人口的表单提交的数据请求。

例如,如果您需要添加一个字段根据请求值,你可以注册一个事件监听器FormEvents: PRE_SUBMIT事件如下:

1 2 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_DATAFormEvents: POST_SET_DATA)

两个事件期间派遣预填充的形式,当形式::setData ()被称为:FormEvents: PRE_SET_DATAFormEvents: 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_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

另请参阅

看到所有表单事件乍一看表单事件信息表

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

B)FormEvents:提交事件

FormEvents:提交事件分派之前形式::提交()方法转换的规范化数据模型和视图数据。

它可以用来改变数据的归一化的数据表示。

数据类型 价值
模型数据 一样的FormEvents: POST_SET_DATA
规范化数据 数据请求从请求使用视图reverse-transformed变压器
视图数据 一样的FormEvents: POST_SET_DATA

另请参阅

看到所有表单事件乍一看表单事件信息表

谨慎

此时,您不能添加或删除字段的形式。

欧宝娱乐app下载地址\组件\形式\扩展\核心\ EventListener\ FixUrlProtocolListener订阅的FormEvents:提交事件以预先考虑违约协议URL字段,提交协议。

C)FormEvents: POST_SUBMIT事件

FormEvents: POST_SUBMIT事件分发经形式::提交()一旦模型和视图数据规范化。

它可以用来获取数据后反规范化。

数据类型 价值
模型数据 规范化数据reverse-transformed使用变压器模型
规范化数据 一样的FormEvents:提交
视图数据 规范化数据转换变压器使用视图

另请参阅

看到所有表单事件乍一看表单事件信息表

谨慎

在这一点上,你不能添加或删除字段当前的形式和它的孩子。

欧宝娱乐app下载地址\组件\形式\扩展\ DataCollector\ EventListener\ DataCollectorListener订阅的FormEvents: POST_SUBMIT事件以收集的信息形式。的欧宝娱乐app下载地址\组件\形式\扩展\验证器\ EventListener\ ValidationListener订阅的FormEvents: POST_SUBMIT事件以自动验证规范化的对象。

注册事件侦听器或事件订阅者

为了能够使用表单事件,您需要创建一个事件侦听器或一个事件订阅者并注册一个事件。

每个的名字“形式”事件上被定义为一个常数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:

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
/ /……使用欧宝娱乐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 ();/ /……

当您已经创建了一个表单类型类,您可以使用其作为更好的可读性的回调方法之一:

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
/ / 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美元事件):无效{/ /……}}

事件订阅者

事件的用户有不同的使用:

  • 改善可读性;
  • 听多个事件;
  • 重组多个侦听器在一个类中。

考虑下面的表单事件订阅者的例子:

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 38 39 40 41 42 43 44 45 46 47 48 49 50
/ / src /形式/ EventListener / AddEmailFieldListener.php名称空间应用程序\形式\EventListener;使用欧宝娱乐app下载地址\组件\EventDispatcher\EventSubscriberInterface;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\EmailType;使用欧宝娱乐app下载地址\组件\形式\FormEvent;使用欧宝娱乐app下载地址\组件\形式\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 ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13
使用应用程序\形式\EventListener\AddEmailFieldListener;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\CheckboxType;使用欧宝娱乐app下载地址\组件\形式\扩展\核心\类型\TextType;/ /……美元形式=美元formFactory- >createBuilder ()- >add (“用户名”,TextType::类)- >add (“showEmail”,CheckboxType::类)- >addEventSubscriber (AddEmailFieldListener ())- >getForm ();/ /……
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode