æ°ççäºä»¶ç³»ç»å¯ä»¥çææ¯`5.1`çæ¬è¡ä¸ºç³»ç»çå级çï¼äºä»¶ç³»ç»ç¸æ¯è¡ä¸ºç³»ç»å¼ºå¤§çå°æ¹å¨äºäºä»¶æ¬èº«å¯ä»¥æ¯ä¸ä¸ªç±»ï¼å¹¶ä¸å¯ä»¥æ´å¥½çæ¯æäºä»¶è®¢é
è
ã
äºä»¶ç¸æ¯è¾ä¸é´ä»¶çä¼å¿æ¯äºä»¶æ¯ä¸é´ä»¶æ´å ç²¾åå®ä½ï¼æè
说ç²åº¦æ´ç»ï¼ï¼å¹¶ä¸æ´éåä¸äºä¸å¡åºæ¯çæ©å±ãä¾å¦ï¼æ们é常ä¼éå°ç¨æ·æ³¨åæè
ç»å½åéè¦åä¸ç³»åæä½ï¼éè¿äºä»¶ç³»ç»å¯ä»¥åå°ä¸ä¾µå
¥åæ代ç å®æç»å½çæä½æ©å±ï¼éä½ç³»ç»çè¦åæ§çåæ¶ï¼ä¹éä½äºBUGçå¯è½æ§ã
>[danger] äºä»¶ç³»ç»çæææä½é½éè¿`think\facade\Event`ç±»è¿è¡éæè°ç¨
>[danger] `V6.0.3+`çæ¬å¼å§ï¼äºä»¶æºå¶ä¸è½å
³é
## å®ä¹äºä»¶
äºä»¶ç³»ç»ä½¿ç¨äºè§å¯è
模å¼ï¼æä¾äºè§£è¦åºç¨çæ´å¥½æ¹å¼ãå¨ä½ éè¦çå¬äºä»¶çä½ç½®ï¼ä¾å¦ä¸é¢æ们å¨ç¨æ·å®æç»å½æä½ä¹åæ·»å å¦ä¸äºä»¶è§¦å代ç ï¼
```
// 触åUserLoginäºä»¶ ç¨äºæ§è¡ç¨æ·ç»å½åçä¸ç³»åæä½
Event::trigger('UserLogin');
```
æè
使ç¨å©æå½æ°
```
event('UserLogin');
```
è¿é`UserLogin`表示ä¸ä¸ªäºä»¶æ è¯ï¼å¦æä½ å®ä¹äºåç¬çäºä»¶ç±»ï¼ä½ å¯ä»¥ä½¿ç¨äºä»¶ç±»åï¼çè³å¯ä»¥ä¼ å
¥ä¸ä¸ªäºä»¶ç±»å®ä¾ï¼ã
```
// ç´æ¥ä½¿ç¨äºä»¶ç±»è§¦å
event('app\event\UserLogin');
```
äºä»¶ç±»å¯ä»¥éè¿å½ä»¤è¡å¿«éçæ
```
php think make:event UserLogin
```
é»è®¤ä¼çæä¸ä¸ª`app\event\UserLogin`äºä»¶ç±»ï¼ä¹å¯ä»¥æå®å®æ´ç±»åçæã
æ们å¯ä»¥ç»äºä»¶ç±»æ·»å æ¹æ³
```
namespace app\event;
use app\model\User;
class UserLogin
{
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
}
```
ä¸è¬äºä»¶ç±»æ é继æ¿ä»»ä½å
¶å®ç±»ã
ä½ å¯ä»¥ç»äºä»¶ç±»ç»å®ä¸ä¸ªäºä»¶æ è¯ï¼ä¸è¬å»ºè®®ç´æ¥å¨åºç¨ç`event.php`äºä»¶å®ä¹æ件ä¸æ¹éç»å®ã
```
return [
'bind' => [
'UserLogin' => 'app\event\UserLogin',
// æ´å¤äºä»¶ç»å®
],
];
```
å¦æä½ éè¦å¨æç»å®ï¼å¯ä»¥ä½¿ç¨
```
Event::bind(['UserLogin' => 'app\event\UserLogin']);
```
>[danger] ThinkPHPçäºä»¶ç³»ç»ä¸ä¾èµäºä»¶ç±»ï¼å¦æ没æé¢å¤çéæ±ï¼ä»
éè¿äºä»¶æ è¯ä¹å¯ä»¥ä½¿ç¨ï¼çå»å®ä¹äºä»¶ç±»ç麻ç¦ã
å¦æä½ æ²¡æå®ä¹äºä»¶ç±»çè¯ï¼åæ éç»å®ã对äºå¤§é¨åçåºæ¯ï¼å¯è½ç¡®å®ä¸éè¦å®ä¹äºä»¶ç±»ã
ä½ å¯ä»¥å¨`event`æ¹æ³ä¸ä¼ å
¥ä¸ä¸ªäºä»¶åæ°
```
// useræ¯å½åç»å½ç¨æ·å¯¹è±¡å®ä¾
event('UserLogin', $user);
```
å¦ææ¯å®ä¹äºäºä»¶ç±»ï¼å¯ä»¥ç´æ¥ä¼ å
¥äºä»¶å¯¹è±¡å®ä¾
```
// useræ¯å½åç»å½ç¨æ·å¯¹è±¡å®ä¾
event(new UserLogin($user));
```
## äºä»¶çå¬
ä½ å¯ä»¥æå¨æ³¨åä¸ä¸ªäºä»¶çå¬
```
Event::listen('UserLogin', function($user) {
//
});
```
æè
使ç¨çå¬ç±»æ¥æ§è¡çå¬
```
Event::listen('UserLogin', 'app\listener\UserLogin');
```
å¯ä»¥éè¿å½ä»¤è¡å¿«éçæä¸ä¸ªäºä»¶çå¬ç±»
```
php think make:listener UserLogin
```
é»è®¤ä¼çæä¸ä¸ª`app\listener\UserLogin`äºä»¶çå¬ç±»ï¼ä¹å¯ä»¥æå®å®æ´ç±»åçæã
äºä»¶çå¬ç±»åªéè¦å®ä¹ä¸ä¸ª`handle`æ¹æ³ï¼æ¯æä¾èµæ³¨å
¥ã
~~~
<?php
namespace app\listener;
class UserLogin
{
public function handle($user)
{
// äºä»¶çå¬å¤ç
}
}
~~~
å¨`handle`æ¹æ³ä¸å¦æè¿åäº`false`ï¼å表示çå¬ä¸æ¢ï¼å°ä¸åæ§è¡è¯¥äºä»¶åé¢ççå¬ã
ä¸è¬å»ºè®®ç´æ¥å¨äºä»¶å®ä¹æ件ä¸å®ä¹å¯¹åºäºä»¶ççå¬ã
```
return [
'bind' => [
'UserLogin' => 'app\event\UserLogin',
// æ´å¤äºä»¶ç»å®
],
'listen' => [
'UserLogin' => ['app\listener\UserLogin'],
// æ´å¤äºä»¶çå¬
],
];
```
## äºä»¶è®¢é
å¯ä»¥éè¿äºä»¶è®¢é
æºå¶ï¼å¨ä¸ä¸ªçå¬å¨ä¸çå¬å¤ä¸ªäºä»¶ï¼ä¾å¦éè¿å½ä»¤è¡çæä¸ä¸ªäºä»¶è®¢é
è
ç±»ï¼
```
php think make:subscribe User
```
é»è®¤ä¼çæ`app\subscribe\User`ç±»ï¼æè
ä½ å¯ä»¥æå®å®æ´ç±»åçæã
ç¶åä½ å¯ä»¥å¨äºä»¶è®¢é
ç±»ä¸æ·»å ä¸åäºä»¶ççå¬æ¹æ³ï¼ä¾å¦ã
~~~
<?php
namespace app\subscribe;
class User
{
public function onUserLogin($user)
{
// UserLoginäºä»¶ååºå¤ç
}
public function onUserLogout($user)
{
// UserLogoutäºä»¶ååºå¤ç
}
}
~~~
çå¬äºä»¶çæ¹æ³å½åè§èæ¯`on`+äºä»¶æ è¯ï¼é©¼å³°å½åï¼ï¼å¦æå¸æç»ä¸æ·»å äºä»¶åç¼æ è¯ï¼å¯ä»¥å®ä¹`eventPrefix`å±æ§ã
~~~
<?php
namespace app\subscribe;
class User
{
protected $eventPrefix = 'User';
public function onLogin($user)
{
// UserLoginäºä»¶ååºå¤ç
}
public function onLogout($user)
{
// UserLogoutäºä»¶ååºå¤ç
}
}
~~~
å¦æå¸æèªå®ä¹è®¢é
æ¹å¼ï¼æè
æ¹æ³è§èï¼ï¼å¯ä»¥å®ä¹`subscribe`æ¹æ³å®ç°ã
~~~
<?php
namespace app\subscribe;
use think\Event;
class User
{
public function onUserLogin($user)
{
// UserLoginäºä»¶ååºå¤ç
}
public function onUserLogout($user)
{
// UserLogoutäºä»¶ååºå¤ç
}
public function subscribe(Event $event)
{
$event->listen('UserLogin', [$this,'onUserLogin']);
$event->listen('UserLogout',[$this,'onUserLogout']);
}
}
~~~
ç¶åå¨äºä»¶å®ä¹æ件注åäºä»¶è®¢é
è
```
return [
'bind' => [
'UserLogin' => 'app\event\UserLogin',
// æ´å¤äºä»¶ç»å®
],
'listen' => [
'UserLogin' => ['app\listener\UserLogin'],
// æ´å¤äºä»¶çå¬
],
'subscribe' => [
'app\subscribe\User',
// æ´å¤äºä»¶è®¢é
],
];
```
å¦æéè¦å¨æ注åï¼å¯ä»¥ä½¿ç¨
```
Event::subscribe('app\subscribe\User');
```
## å
ç½®äºä»¶
å
ç½®çç³»ç»äºä»¶å
æ¬ï¼
| äºä»¶| æè¿° | åæ° |
| --- | --- | --- |
| AppInit | åºç¨åå§åæ ç¾ä½ | æ |
| HttpRun | åºç¨å¼å§æ ç¾ä½ | æ |
| HttpEnd | åºç¨ç»ææ ç¾ä½ | å½åååºå¯¹è±¡å®ä¾ |
| LogWrite | æ¥å¿writeæ¹æ³æ ç¾ä½ | å½ååå
¥çæ¥å¿ä¿¡æ¯ |
| RouteLoaded| è·¯ç±å è½½å®æ | æ |
>[danger] `AppInit`äºä»¶å®ä¹å¿
é¡»å¨å
¨å±äºä»¶å®ä¹æ件ä¸å®ä¹ï¼å
¶å®äºä»¶æ¯æå¨åºç¨çäºä»¶å®ä¹æ件ä¸å®ä¹ã
åæ¥`5.1`çä¸äºè¡ä¸ºæ ç¾å·²ç»åºå¼ï¼ææåæ¶çæ ç¾é½å¯ä»¥ä½¿ç¨ä¸é´ä»¶æ´å¥½çæ¿ä»£ãå¯ä»¥æä¸é´ä»¶çæå¤ç请æ±ä»¥åååºè¾åºç¸å
³çç¹æ®äºä»¶ãäºå®ä¸ï¼ä¸é´ä»¶ç`handler`æ¹æ³åªæ¯å
·æç¹æ®çåæ°ä»¥åè¿åå¼èå·²ã
æ°æ®åºæä½çåè°ä¹ç§°ä¸ºæ¥è¯¢äºä»¶ï¼æ¯é对æ°æ®åºçCURDæä½è设计çåè°æ¹æ³ï¼ä¸»è¦å
æ¬ï¼
| äºä»¶ | æè¿° |
| --- | --- |
| before\_select | `select`æ¥è¯¢ååè° |
| before\_find | `find`æ¥è¯¢ååè° |
| after\_insert | `insert`æä½æåååè° |
| after\_update | `update`æä½æåååè° |
| after\_delete | `delete`æä½æåååè° |
> æ¥è¯¢äºä»¶çåæ°å°±æ¯å½åçæ¥è¯¢å¯¹è±¡å®ä¾ã
模åäºä»¶å
å«ï¼
| é©å | 对åºæä½ |
| --- | --- |
| after\_read | æ¥è¯¢å |
| before\_insert | æ°å¢å |
| after\_insert | æ°å¢å |
| before\_update | æ´æ°å |
| after\_update | æ´æ°å |
| before\_write | åå
¥å |
| after\_write | åå
¥å |
| before\_delete | å é¤å |
| after\_delete | å é¤å |
`before_write`å`after_write`äºä»¶æ 论æ¯æ°å¢è¿æ¯æ´æ°é½ä¼æ§è¡ã
> 模åäºä»¶æ¹æ³çåæ°å°±æ¯å½åç模å对象å®ä¾ã
- åºè¨
- åºç¡
- å®è£
- å¼åè§è
- ç®å½ç»æ
- é ç½®
- æ¶æ
- 请æ±æµç¨
- æ¶ææ»è§
- å ¥å£æ件
- å¤åºç¨æ¨¡å¼
- URL访é®
- 容å¨åä¾èµæ³¨å ¥
- æå¡
- é¨é¢
- ä¸é´ä»¶
- äºä»¶
- è·¯ç±
- è·¯ç±å®ä¹
- åéè§å
- è·¯ç±å°å
- è·¯ç±åæ°
- è·¯ç±ä¸é´ä»¶
- è·¯ç±åç»
- èµæºè·¯ç±
- 注解路ç±
- è·¯ç±ç»å®
- ååè·¯ç±
- MISSè·¯ç±
- è·¨å请æ±
- URLçæ
- æ§å¶å¨
- æ§å¶å¨å®ä¹
- åºç¡æ§å¶å¨
- 空æ§å¶å¨
- èµæºæ§å¶å¨
- æ§å¶å¨ä¸é´ä»¶
- 请æ±
- 请æ±å¯¹è±¡
- 请æ±ä¿¡æ¯
- è¾å ¥åé
- 请æ±ç±»å
- HTTP头信æ¯
- 伪éæ
- åæ°ç»å®
- 请æ±ç¼å
- ååº
- ååºè¾åº
- ååºåæ°
- éå®å
- æ件ä¸è½½
- æ°æ®åº
- è¿æ¥æ°æ®åº
- åå¸å¼æ°æ®åº
- æ¥è¯¢æé å¨
- æ¥è¯¢æ°æ®
- æ·»å æ°æ®
- æ´æ°æ°æ®
- å é¤æ°æ®
- æ¥è¯¢è¡¨è¾¾å¼
- é¾å¼æä½
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- èåæ¥è¯¢
- å页æ¥è¯¢
- æ¶é´æ¥è¯¢
- é«çº§æ¥è¯¢
- è§å¾æ¥è¯¢
- JSONå段
- åæ¥è¯¢
- åçæ¥è¯¢
- æ¥è¯¢äºä»¶
- è·åå¨
- äºå¡æä½
- åå¨è¿ç¨
- æ°æ®é
- æ°æ®åºé©±å¨
- 模å
- å®ä¹
- 模åå段
- æ°å¢
- æ´æ°
- å é¤
- æ¥è¯¢
- æ¥è¯¢èå´
- JSONå段
- è·åå¨
- ä¿®æ¹å¨
- æç´¢å¨
- æ°æ®é
- èªå¨æ¶é´æ³
- åªè¯»å段
- 软å é¤
- ç±»å转æ¢
- 模åè¾åº
- 模åäºä»¶
- 模åå ³è
- ä¸å¯¹ä¸å ³è
- ä¸å¯¹å¤å ³è
- è¿ç¨ä¸å¯¹å¤
- è¿ç¨ä¸å¯¹ä¸
- å¤å¯¹å¤å ³è
- å¤æå ³è
- å ³èé¢è½½å ¥
- å ³èç»è®¡
- å ³èè¾åº
- è§å¾
- 模æ¿åé
- è§å¾è¿æ»¤
- 模æ¿æ¸²æ
- 模æ¿å¼æ
- è§å¾é©±å¨
- é误åæ¥å¿
- å¼å¸¸å¤ç
- æ¥å¿å¤ç
- è°è¯
- è°è¯æ¨¡å¼
- Traceè°è¯
- SQLè°è¯
- åéè°è¯
- è¿ç¨è°è¯
- éªè¯
- éªè¯å¨
- éªè¯è§å
- é误信æ¯
- éªè¯åºæ¯
- è·¯ç±éªè¯
- å ç½®è§å
- 表å令ç
- 注解éªè¯
- æ项
- ç¼å
- Session
- Cookie
- å¤è¯è¨
- ä¸ä¼
- å½ä»¤è¡
- å¯å¨å ç½®æå¡å¨
- æ¥ççæ¬
- èªå¨çæåºç¨ç®å½
- å建类åºæ件
- æ¸ é¤ç¼åæ件
- çææ°æ®è¡¨å段ç¼å
- çæè·¯ç±æ å°ç¼å
- è¾åºè·¯ç±å®ä¹
- èªå®ä¹æ令
- æ©å±åº
- æ°æ®åºè¿ç§»å·¥å ·
- Workerman
- thinkå©æå·¥å ·åº
- éªè¯ç
- Swoole
- éå½
- å©æå½æ°
- å级æ导
- æ´æ°æ¥å¿