学习下 laravel 的事件系统。
Laravel 的事件提供了一个简单的观察者实现,能够订阅和监听应用中发生的各种事件。
先以一个登陆日志来作为例子开始事件的学习吧。
注册事件 && 监听器
在 app\Providers\EventServiceProvider.php 中,添加以下内容:
1 2 3 4 5 6 7 8
| protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], 'App\Events\LoginEvent' => [ 'App\Listeners\LoginListener' ] ];
|
然后运行命令,生成事件和监听器:
1
| php artisan event:generate
|
运行结束后,事件和监听器都会被自动创建好。
在监听中打个 log: info(‘user login event’)
然后找个控制器触发事件。
event(new LoginEvent());
可以看到 log 文件中有一条新纪录:
[2019-03-27 08:16:21] local.INFO: user login event
走到这里,理论上已经可以做很多事情了,但是对于登录日志来说,这样处理并不完美,因为 larave 内置已经写好了登录事件,只需要去调用就可以了。
改造事件
在身份验证处理过程中 Laravel 引发了多种事件 。
可以在 EventServiceProvider 中附着这些事件的监听器。
文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
|
protected $listen = [ 'Illuminate\Auth\Events\Registered' => [ 'App\Listeners\LogRegisteredUser', ],
'Illuminate\Auth\Events\Attempting' => [ 'App\Listeners\LogAuthenticationAttempt', ],
'Illuminate\Auth\Events\Authenticated' => [ 'App\Listeners\LogAuthenticated', ],
'Illuminate\Auth\Events\Login' => [ 'App\Listeners\LogSuccessfulLogin', ],
'Illuminate\Auth\Events\Failed' => [ 'App\Listeners\LogFailedLogin', ],
'Illuminate\Auth\Events\Logout' => [ 'App\Listeners\LogSuccessfulLogout', ],
'Illuminate\Auth\Events\Lockout' => [ 'App\Listeners\LogLockout', ],
'Illuminate\Auth\Events\PasswordReset' => [ 'App\Listeners\LogPasswordReset', ], ];
|
这里就只使用登录事件。
修改 EventServiceProvider:
1 2 3
| 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\LoginListener' ]
|
再改改 listener:
1 2 3 4
| public function handle($guard) { info('user login event', ['username'=>$guard->user->name]); dd($guard); }
|
触发事件
退出帐号重新登录,可以看到以下内容:
可以再优化一下:
1 2 3 4 5 6 7 8 9
| public function handle($guard) { $log = [ 'name' => $guard->user->name, 'email'=> $guard->user->email, 'ip'=> \Request::getClientIp(true), 'datetime' => Carbon::now() ]; info('user login event', $log); }
|
这里可以选中用 log 存储还是用 mysql 存储。
事件的学习就是这些了,平时开发要经常使用避免遗忘。