11. 事件机制
xiaohuilam opened this issue · comments
根据 Laravel 的 Events 文档 (中文版:事件系统), EventServiceProvider
的使用方法为:
/**
* 注册应用中的其它事件。
*
* @return void
*/
public function boot()
{
parent::boot();
Event::listen('event.name', function ($foo, $bar) {
//
});
}
如果花点时间研究 Event
这个 Facade,我们可以找到他穿透类其实为 Illuminate\Events\Dispatcher
。
Illuminate\Events\Dispatcher
类的 __construct 方法为:
laravel/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php
Lines 59 to 62 in d081c91
作用是将容器设置到
$this->container
属性
监听
我们刚刚在 EventServiceProvider
调用的 Event::listen
方法的代码为:
laravel/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php
Lines 71 to 80 in d081c91
如果监听了通配事件,
setupWildcardListen
在辗转后跟else
一样的调用到了makeListener
laravel/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php
Lines 349 to 362 in d081c91
注意,返回的是闭包!并不会立即执行。
在存放到 $this->listeners
后,事件们就静静地等待被触发
触发
在我们调用 event()
辅助方法后,触发的逻辑其实走到了 dispatch
方法
laravel/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php
Lines 193 to 229 in d081c91
核心逻辑就这句: