形成事件
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
形成事件
表单组件提供一个结构化的过程让你定制你的形式,利用的EventDispatcher组件。使用表单事件,您可以修改信息或字段在不同工作流的步骤:从人口的表单提交的数据请求。
利用Symfony的事件系统,事件ob娱乐下载监听器可以注册表单。
例如,如果您想注册一个函数FormEvents: PRE_SUBMIT
事件,下面的代码允许您添加一个字段,根据请求的值:
1 2 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 ()代替。
B)FormEvents: POST_SET_DATA
事件
的FormEvents: POST_SET_DATA
活动结束的时候形式::setData ()方法。这个事件在这里主要是读取数据后预填充表单。
数据类型 | 价值 |
---|---|
模型数据 | 模型数据注入setData () |
规范化数据 | 使用模型变压器模型数据转换 |
视图数据 | 规范化数据转换变压器使用视图 |
另请参阅
看到所有表单事件乍一看表单事件信息表。
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 |
另请参阅
看到所有表单事件乍一看表单事件信息表。
B)FormEvents:提交
事件
的FormEvents:提交
事件分派之前形式::提交()方法转换的规范化数据模型和视图数据。
它可以用来改变数据的归一化的数据表示。
数据类型 | 价值 |
---|---|
模型数据 | 一样的FormEvents: POST_SET_DATA |
规范化数据 | 数据请求从请求使用视图reverse-transformed变压器 |
视图数据 | 一样的FormEvents: POST_SET_DATA |
另请参阅
看到所有表单事件乍一看表单事件信息表。
谨慎
此时,您不能添加或删除字段的形式。
C)FormEvents: POST_SUBMIT
事件
的FormEvents: POST_SUBMIT
事件分发经形式::提交()一旦模型和视图数据规范化。
它可以用来获取数据后反规范化。
数据类型 | 价值 |
---|---|
模型数据 | 规范化数据reverse-transformed使用变压器模型 |
规范化数据 | 一样的FormEvents:提交 |
视图数据 | 规范化数据转换变压器使用视图 |
另请参阅
看到所有表单事件乍一看表单事件信息表。
谨慎
在这一点上,你不能添加或删除字段当前的形式和它的孩子。
注册事件侦听器或事件订阅者
为了能够使用表单事件,您需要创建一个事件侦听器或一个事件订阅者并注册一个事件。
每个的名字“形式”事件上被定义为一个常数FormEvents类。此外,每个事件回调(侦听器或订阅者的方法)传递一个参数,这是一个实例FormEvent。事件对象包含一个引用的当前状态和当前正在处理的数据形式。
的名字 | FormEvents 常数 |
事件的数据 |
---|---|---|
form.pre_set_data |
FormEvents: PRE_SET_DATA |
模型数据 |
form.post_set_data |
FormEvents: POST_SET_DATA |
模型数据 |
form.pre_bind |
FormEvents: PRE_SUBMIT |
请求数据 |
form.bind |
FormEvents:提交 |
规范化数据 |
form.post_bind |
FormEvents: POST_SUBMIT |
视图数据 |
事件监听器
一个事件侦听器可以是任何类型的有效的可调用的。
创建和绑定一个事件侦听器的形式:
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
/ /……使用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 ();/ /……
当您已经创建了一个表单类型类,您可以使用其作为更好的可读性的回调方法之一:
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 / AppBundle /形式/ SubscriptionType.php名称空间AppBundle\形式;使用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美元事件){/ /……}}
事件订阅者
事件的用户有不同的使用:
- 改善可读性;
- 听多个事件;
- 重组多个侦听器在一个类中。
考虑下面的表单事件订阅者的例子:
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 / AppBundle /形式/ EventListener / AddEmailFieldListener.php名称空间AppBundle\形式\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 ()
方法:
1 2 3 4 5 6 7 8 9 10 11 12 13
使用AppBundle\形式\EventListener\AddEmailFieldListener;使用ob娱乐下载\组件\形式\扩展\核心\类型\CheckboxType;使用ob娱乐下载\组件\形式\扩展\核心\类型\TextType;/ /……美元形式=美元formFactory- >createBuilder ()- >add (“用户名”,TextType::类)- >add (“showEmail”,CheckboxType::类)- >addEventSubscriber (新AddEmailFieldListener ())- >getForm ();/ /……