欢迎来到程序员中文网!

首页 Linux Mysql C++ Python PHP JavaScript 资源下载 动态 开源推荐
我要投稿 投诉建议

PHP 设计模式:观察者模式与事件系统

时间:2026年08月12日 04:46:50 浏览:0

观察者模式定义


观察者模式定义了对象间的一对多依赖,当一个对象状态改变时,所有依赖者自动更新。


代码实现


// 事件接口
interface Event {}

// 监听器接口
interface Listener {
public function handle(Event $event): void;
}

// 事件分发器
class EventDispatcher {
private array $listeners = [];

public function addListener(string $eventClass, Listener $listener): void {
$this->listeners[$eventClass][] = $listener;
}

public function dispatch(Event $event): void {
$class = get_class($event);
foreach ($this->listeners[$class] ?? [] as $listener) {
$listener->handle($event);
}
}
}

// 自定义事件
class UserRegisteredEvent implements Event {
public function __construct(public string $email) {}
}

// 监听器
class SendWelcomeEmailListener implements Listener {
public function handle(Event $event): void {
if ($event instanceof UserRegisteredEvent) {
echo "发送欢迎邮件到 {$event->email}";
}
}
}

class CreateProfileListener implements Listener {
public function handle(Event $event): void {
echo "创建用户资料";
}
}

// 使用
$dispatcher = new EventDispatcher();
$dispatcher->addListener(UserRegisteredEvent::class, new SendWelcomeEmailListener());
$dispatcher->addListener(UserRegisteredEvent::class, new CreateProfileListener());

$dispatcher->dispatch(new UserRegisteredEvent('user@example.com'));

Laravel 事件系统


Laravel 提供了优雅的事件/监听器实现:


php artisan make:event UserRegistered
php artisan make:listener SendWelcomeEmail --event=UserRegistered

EventServiceProvider 注册,然后 event(new UserRegistered($user)) 触发。


观察者模式让业务解耦,扩展性极强,是大型项目的常用架构。