- Symfony 教程
- Symfony - 首页
- Symfony - 简介
- Symfony - 安装
- Symfony - 架构
- Symfony - 组件
- Symfony - 服务容器
- Symfony - 事件 & 事件监听器
- Symfony - 表达式
- Symfony - Bundles (捆绑包)
- 创建简单的Web应用程序
- Symfony - 控制器
- Symfony - 路由
- Symfony - 视图引擎
- Symfony - Doctrine ORM
- Symfony - 表单
- Symfony - 验证
- Symfony - 文件上传
- Symfony - Ajax 控制
- Cookie & 会话管理
- Symfony - 国际化
- Symfony - 日志记录
- Symfony - 邮件管理
- Symfony - 单元测试
- Symfony - 高级概念
- Symfony - REST 版本
- Symfony - CMF 版本
- 完整的运行示例
- Symfony 有用资源
- Symfony - 快速指南
- Symfony - 有用资源
- Symfony - 讨论
Symfony - 事件和事件监听器
Symfony 通过其事件调度器组件提供基于事件的编程。任何企业应用程序都需要基于事件的编程来创建高度可定制的应用程序。事件是对象相互交互的主要工具之一。没有事件,对象就无法有效地交互。
基于事件的编程过程可以概括为:一个被称为事件源的对象请求中央调度器对象注册一个事件,例如 user.registered。一个或多个被称为监听器的对象请求中央调度器对象监听特定事件,例如 user.registered。在某个时刻,事件源对象请求中央调度器对象调度事件,例如 user.registered,以及包含必要信息的事件对象。中央调度器会通知所有监听器对象有关事件(例如 user.registered)及其事件对象的信息。
在基于事件的编程中,我们有四种类型的对象:事件源、事件监听器、事件调度器和事件本身。
让我们编写一个简单的应用程序来理解这个概念。
步骤 1 - 创建一个项目,event-dispatcher-example。
cd /path/to/dir mkdir event-dispatcher-example cd event-dispatcher-example composer require symfony/event-dispatcher
步骤 2 - 创建一个类,User。
class User { public $name; public $age; } $user = new User(); $user->name = "Jon"; $user->age = 25
步骤 3 - 创建一个事件,UserRegisteredEvent。
use Symfony\Component\EventDispatcher\Event; class UserRegisteredEvent extends Event { const NAME = 'user.registered'; protected $user; public function __construct(User $user) { $this-<user = $user; } public function getUser() { return $this-<user; } } $event = new UserRegisteredEvent($user);
这里,UserRegisteredEvent 可以访问User 对象。事件的名称为user.registered。
步骤 4 - 创建一个监听器,UserListener。
class UserListener { public function onUserRegistrationAction(Event $event) { $user = $event->getUser(); echo $user->name . "\r\n"; echo $user->age . "\r\n"; } } $listener = new UserListener();
步骤 5 - 创建一个事件调度器对象。
use Symfony\Component\EventDispatcher\EventDispatcher; $dispatcher = new EventDispatcher();
步骤 6 - 使用调度器对象及其方法addListener连接监听器和事件。
$dispatcher ->addListener( UserRegisteredEvent::NAME, array($listener, 'onUserRegistrationAction'));
我们还可以添加匿名函数作为事件监听器,如下面的代码所示。
$dispatcher ->addListener( UserRegisteredEvent::NAME, function(Event $event) { $user = $event->getUser(); echo $user->name . "\r\n"; });
步骤 7 - 最后,使用事件调度器的dispatch方法触发/调度事件。
$dispatcher->dispatch(UserRegisteredEvent::NAME, $event);
完整的代码清单如下。
main.php
<?php require __DIR__ . '/vendor/autoload.php'; use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\EventDispatcher\Event; class User { public $name; public $age; } class UserRegisteredEvent extends Event { const NAME = 'user.registered'; protected $user; public function __construct(User $user) { $this->user = $user; } public function getUser() { return $this->user; } } class UserListener { public function onUserRegistrationAction(Event $event) { $user = $event->getUser(); echo $user->name . "\r\n"; echo $user->age . "\r\n"; } } $user = new User(); $user->name = "Jon"; $user->age = 25; $event = new UserRegisteredEvent($user); $listener = new UserListener(); $dispatcher = new EventDispatcher(); $dispatcher ->addListener( UserRegisteredEvent::NAME, function(Event $event) { $user = $event->getUser(); echo $user->name . "\r\n"; }); $dispatcher ->addListener( UserRegisteredEvent::NAME, array($listener, 'onUserRegistrationAction')); $dispatcher->dispatch(UserRegisteredEvent::NAME, $event); ?>
结果
Jon Jon 25
Symfony Web 框架有很多事件,可以为这些事件注册监听器并相应地进行编程。一个示例事件是 kernel.exception,相应的事件是GetResponseForExceptionEvent,它包含响应对象(Web 请求的输出)。这用于捕获异常并使用通用错误信息修改响应,而不是向用户显示运行时错误。