视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
你知道laravel事件的实现原理吗
2020-11-02 22:06:53 责编:小采
文档
 下面由Laravel教程栏目给大家介绍laravel事件的实现原理,希望对需要的朋友有所帮助!

简单使用

1.配置事件和AppProviders EventServiceProvider的listen属性

protected $listen = [
 'AppEventsUserAdd' => [
 'AppListenersUserAddListener',
 ],
 ];

2.生成对应的事件类和监听类文件,

php artisan event:generate

会生成AppEventsUserAdd,AppListenersUserAddListener两个类文件。

事件类主要是保存对应的信息的作用,比如一个属性保存user模型实例,事件类实例会传给对应的事件的handle方法处理事件逻辑。

public function __construct(User $user)
{
 $this->user = $user;//创建事件实例时保存的信息
}

AppListenersUserAddListener 的handle方法就是处理逻辑的地方

public function handle(UserAdd $event)
{
 dd($event->user);//获取到对应事件实例的信息
}

3.事件的触发,使用公共函数events()。传入对应事件类的实例

event(new AppEventsUserAdd($user));//执行这一步时,就会执行到handle方法

实现原理(IlluminateEventsDispatcher类)

public function register()
{
 $this->app->singleton('events', function ($app) {
 return (new Dispatcher($app))->setQueueResolver(function () use ($app) {
 return $app->make(QueueFactoryContract::class);
 });
 });
}

注册到IOC容器的events其实是IlluminateEventsDispatcher类,也就是门面Event其实调用的是这个类的方法

重要属性和方法:

protected $listeners = [];
protected $wildcards = [];
protected $wildcardsCache = [];//这三个属性都是配置事件与关系的数组,时间注册进来后就是放到对应的数组里面的。
//这个方法就是注册事件用的,把配置好的事件注入到上面的属性中
public function listen($events, $listener)
 {
 foreach ((array) $events as $event) {
 if (Str::contains($event, '*')) {
 $this->setupWildcardListen($event, $listener);
 } else {
 $this->listeners[$event][] = $this->makeListener($listener);
 }
 }
 }
//这个方法就是执行对应事件的方法,找到事件下面的是所有,然后执行。
public function dispatch($event, $payload = [], $halt = false),

下载本文
显示全文
专题