形成事件
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.6,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
形成事件
表单组件提供了一个结构化的过程,使您可以通过使用EventDispatcher组件.使用表单事件,您可以在工作流的不同步骤中修改信息或字段:从填充表单到从请求提交数据。
使用Form组件注册事件侦听器非常容易。
方法注册一个函数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 ()代替。
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 |
规范化数据 | 使用视图转换器对来自请求的数据进行反向转换 |
视图数据 | 和在FormEvents: POST_SET_DATA |
另请参阅
中查看所有表单事件表单事件信息表.
谨慎
此时,您不能向表单添加或删除字段。
C)FormEvents: POST_SUBMIT
事件
的FormEvents: POST_SUBMIT
事件之后将被分派形式::提交()一旦模型和视图数据被非规格化。
它可以用来取回非规格化后的数据。
数据类型 | 价值 |
---|---|
模型数据 | 使用模型转换器反向转换规范化数据 |
规范化数据 | 和在FormEvents:提交 |
视图数据 | 使用视图转换器转换的规范化数据 |
另请参阅
中查看所有表单事件表单事件信息表.
谨慎
此时,您不能向表单添加或删除字段。
注册事件监听器或事件订阅者
为了能够使用Form事件,您需要创建事件侦听器或事件订阅器,并将其注册到事件。
控件上的一个常量定义了每个“表单”事件的名称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 |
视图数据 |
2.3
在Symfon欧宝娱乐app下载地址y 2.3之前,FormEvents: PRE_SUBMIT
,FormEvents:提交
而且FormEvents: POST_SUBMIT
被称为FormEvents: PRE_BIND
,FormEvents:绑定
而且FormEvents: POST_BIND
.
谨慎
的FormEvents: PRE_BIND
,FormEvents:绑定
而且FormEvents: POST_BIND
常量将在Symfony 3.0版中被移除。欧宝娱乐app下载地址事件名称仍然保留其原始值,因此请确保使用FormEvents
为向前兼容而在代码中添加常量。
事件监听器
事件监听器可以是任何类型的有效可调用对象。
创建一个事件监听器并将其绑定到表单非常简单:
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
/ /……使用欧宝娱乐app下载地址\组件\形式\FormEvent;使用欧宝娱乐app下载地址\组件\形式\FormEvents;$形式=$formFactory->createBuilder ()->add (“用户名”,“文本”)->add (“show_email”,“复选框”)->addEventListener (FormEvents::PRE_SUBMIT,函数(FormEvent$事件){$用户=$事件->getData ();$形式=$事件->getForm ();如果(!$用户) {返回;}//检查用户是否选择显示他的电子邮件。//如果数据是以前提交的,则为//包含在请求变量中的变量需要被删除。如果(真正的===$用户[“show_email”) {$形式->add (“电子邮件”,“电子邮件”);}其他的{设置($用户[“电子邮件”]);$事件->setData ($用户);}})->getForm ();/ /……
当你创建了一个表单类型类,你可以使用它的一个方法作为回调,以获得更好的可读性:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ /……类SubscriptionType扩展AbstractType{公共函数buildForm(FormBuilderInterface$构建器数组,$选项){$构建器->add (“用户名”,“文本”);$构建器->add (“show_email”,“复选框”);$构建器->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
使用欧宝娱乐app下载地址\组件\EventDispatcher\EventSubscriberInterface;使用欧宝娱乐app下载地址\组件\形式\FormEvent;使用欧宝娱乐app下载地址\组件\形式\FormEvents;类AddEmailFieldListener实现了EventSubscriberInterface{公共静态函数getSubscribedEvents(){返回数组(FormEvents::PRE_SET_DATA = >“onPreSetData”, FormEvents::PRE_SUBMIT = >“onPreSubmit”,);}公共函数onPreSetData(FormEvent$事件){$用户=$事件->getData ();$形式=$事件->getForm ();//检查用户是否从初始数据中选择了//是否显示他的邮件。如果(真正的===$用户->isShowEmail ()) {$形式->add (“电子邮件”,“电子邮件”);}}公共函数onPreSubmit(FormEvent$事件){$用户=$事件->getData ();$形式=$事件->getForm ();如果(!$用户) {返回;}//检查用户是否选择显示他的电子邮件。//如果数据是以前提交的,则为//包含在需要删除的请求变量中。如果(真正的===$用户[“show_email”) {$形式->add (“电子邮件”,“电子邮件”);}其他的{设置($用户[“电子邮件”]);$事件->setData ($用户);}}}
要注册事件订阅者,使用addEventSubscriber()方法:
1 2 3 4 5 6 7 8 9
/ /……$形式=$formFactory->createBuilder ()->add (“用户名”,“文本”)->add (“show_email”,“复选框”)->addEventSubscriber (新AddEmailFieldListener ())->getForm ();/ /……