Laravel进阶系列笔记--(六)Laravel 事件监听
作者:温新
时间:2021-07-07
hi,我是温新,一名PHPer。
Lravel事件使用观察者模型实现。
有这样一个场景,用户注册后发送一封邮件给用户,这时就可以用到事件监听了,监听用户注册这个动作,然后发送邮件。用到事件的场景还是比较多,因此,尽情发挥吧。
基本事件的快速使用
在本案例中,将以添加用户作为案例。这里我们模拟用户注册后将用户信息写入日志。
使用一个新的项目并保证你的数据库已连接。
第一步:定义路由
// web.php
Route::get('user/add', 'UserController@add');
Route::post('user/store', 'UserController@store');
第二步:定义控制器与方法
创建控制器
php artisan make:controller UserController
添加方法
// app/Http/Controllers/UserController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function add()
{
return view('user.add');
}
public function store(Request $request)
{
}
}
第三步:创建视图
文件:resources/views/user/add.php
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
<form action="{{ url('user/store') }}" method="post">
@csrf
用户名:<input type="text" name="name">
邮箱:<input type="text" name="email">
<input type="submit" value="提交">
</form>
</body>
</html>
第四步:创建用户注册事件类
php artisan make:event UserAdd
修改事件类方法
// app/Events/UserAdd.php
use App\Models\User;
public $user = null;
public function __construct(User $user)
{
$this->user = $user;
}
第五步:创建用户注册事件监听类
// 创建监听类并绑定事件类
php artisan make:listener UserAddLog --event=UserAdd
修改监听类
use App\Events\UserAdd;
public function handle(UserAdd $event)
{
Log::info('用户 ' . $event->user->name . '刚刚注册了');
}
第六步:注册事件监听
文件:app/Providers/EventServiceProvider.php
use App\Events\UserAdd;
use App\Listeners\UserAddLog;
protected $listen = [
UserAdd::class => [
UserAddLog::class,
],
];
事件类UserAdd
被当作了键,监听类UserAddLog
被当做值;
第七步:添加数据
文件:UserController.php
中的store
方法
public function store(Request $request)
{
$data = $request->except('_token');
$data['password'] = 123456;
$data['lover_id'] = 0;
$user = \App\Models\User::create($data);
// 用户添加成功后的事件监听
event(new UserAdd($user));
return redirect('/user/add');
}
事件订阅者
上一篇文章中有使用到事件订阅者去监听事件,本篇继续记录。
使用事件订阅者可以在subscribe
方法中定义多个事件处理器,该方法接收一个事件分发器实例。可以在该方法中使用listen
方法注册事件监听器。
下面的案例编写一个监听删除用户之后的动作。
文档并没有完全的介绍,有时候看着文档就会踩坑。
需要注意的是,模型事件与Laravel事件在使用方法上是有一点不同的。上篇文章使用了订阅者来监听模型事件,本篇文章是针对Laravel事件的使用。在阅读本篇事件订阅者可以对比上篇文章的的订阅者使用,看看有哪些不同。
上篇文章使用的是删除的案例,那么这篇文章就用添加的案例。
前四个步骤是一样的,这里从第四步开始
第一步:定义路由
第二步:定义控制器与方法
第三步:创建视图
第四步:创建事件类
创建事件类
// 用户注册事件
php artisan make:event UserAddEvent
// 删除用户事件
php artisan make:event UserDeletedEvent
下面编写事件类
用户注册事件
// app/Events/UserAddEvent.php
use App\Models\User;
public $user = null;
public function __construct(User $user)
{
$this->user = $user;
}
用户删除事件
// app/Events/UserDeletedEvent.php
use App\Models\User;
public $user = null;
public function __construct(User $user)
{
$this->user = $user;
}
第五步:手动创建事件订阅者
文件:app/Listeners/UserEventSubscribe.php
<?php
namespace App\Listeners;
use App\Events\UserAddEvent;
use App\Events\UserDeletedEvent;
use Illuminate\Support\Facades\Log;
class UserEventSubscribe
{
// 用户添加后触发
public function handleAddUser($event)
{
Log::info($event->user->name . '刚刚注册成为了会员');
}
// 删除用户后触发
public function handleDeletedUser($event)
{
Log::info($event->user->name . '被删除了');
}
public function subscribe($event)
{
// 可以用此方式
//$event->listen(
// 'App\Events\UserAddEvent',
// 'App\Listeners\UserEventSubscribe@handleAddUser'
//);
return [
UserAddEvent::class => [
[UserEventSubscribe::class, 'handleAddUser'],
],
UserDeletedEvent::class => [
[UserEventSubscribe::class, 'handleDeletedUser']
],
];
}
}
第六步:注册事件订阅者
文件:app/Providers/EventServiceProvider.php
protected $subscribe = [
'App\Listeners\UserEventSubscribe',
];
第七步:测试
1)添加用于删除测试的路由与方法
// web.php
Route::get('user/delete', 'UserController@delete');
// UserController.php
public function delete()
{
$user = \App\Models\User::find(148);
$user->delete();
// 删除后触发
event(new UserDeletedEvent($user));
}
2)路由访问测试,然后打开laravel.log
文件看看没有日志写入成功。
我是温新
每天进步一点点,就一点点