Skip to content

Commit 549b740

Browse files
committed
docs: Laravel 观察者模式
1 parent 8f0afff commit 549b740

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
## Laravel事件之观察者模式
2+
3+
## 观察者模式
4+
5+
Laravel的事件提供了一个简单的观察者实现,能够订阅和监听应用中发生的各种事件。
6+
7+
既然用到观察者实现,那我们先来说下什么是观察者
8+
9+
观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。
10+
11+
场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码
12+
13+
观察者模式实现了低耦合,非侵入式的通知与更新机制
14+
15+
具体代码实现
16+
17+
```php
18+
19+
20+
/**
21+
* 观察者接口类
22+
* Interface ObServer
23+
*/
24+
interface ObServer
25+
{
26+
public function update($event_info = null);
27+
}
28+
29+
/**
30+
* 观察者1
31+
*/
32+
class ObServer1 implements ObServer
33+
{
34+
public function update($event_info = null)
35+
{
36+
echo "观察者1 收到执行通知 执行完毕!\n";
37+
}
38+
}
39+
40+
/**
41+
* 观察者1
42+
*/
43+
class ObServer2 implements ObServer
44+
{
45+
public function update($event_info = null)
46+
{
47+
echo "观察者2 收到执行通知 执行完毕!\n";
48+
}
49+
}
50+
51+
52+
53+
/**
54+
* 事件
55+
* Class Event
56+
*/
57+
class Event
58+
{
59+
60+
//增加观察者
61+
public function add(ObServer $ObServer)
62+
{
63+
$this->ObServers[] = $ObServer;
64+
}
65+
66+
//事件通知
67+
public function notify()
68+
{
69+
foreach ($this->ObServers as $ObServer) {
70+
$ObServer->update();
71+
}
72+
}
73+
74+
/**
75+
* 触发事件
76+
*/
77+
public function trigger()
78+
{
79+
//通知观察者
80+
$this->notify();
81+
}
82+
}
83+
84+
85+
//创建一个事件
86+
$event = new Event();
87+
//为事件增加旁观者
88+
$event->add(new ObServer1());
89+
$event->add(new ObServer2());
90+
//执行事件 通知旁观者
91+
$event->trigger();
92+
93+
```
94+
95+
## Laravel中使用事件
96+
97+
在laravel中事件使用特别简单,我们可以通过
98+
99+
```bash
100+
101+
php artisan make:event // 创建事件
102+
php artisan make:listener // 创建事件监听者,可以为多个。
103+
104+
```
105+
laravel 事件类保存在 app/Events 目录中,而这些事件的的监听器则被保存在 app/Listeners 目录下。
106+
107+
```php
108+
109+
// 在程序需要触发事件的地方通过event()触发事件,比如注入给用户发送站内信的事件,发送邮件的事件
110+
111+
event(new SendMailEvent());
112+
113+
```
114+
115+
116+
[示例代码下载链接](https://github.com/cxp1539/laravel-core-learn/blob/master/code/Class6.php)

0 commit comments

Comments
 (0)