快速生成
1.绑定事件和监听器
path:App\Providers\EventServiceProvider
protected $listen = [
'App\Events\TestEvent' => [
'App\Listeners\TestEventListener',
],
];
2.执行命令,自动生成事件文件 和 监听器文件
php artisan event:generate
注册事件
1.注入要操作的对象
path:App\Events\TestEvent
class TestEvent{
...
public $user;
public function __construct(User $user)
{
$this->user= $user;
}
}
监听器(一对一处理事件)
1.handle方法使用注入的对象
path:App\Listeners\TestEventListener
class TestEventListener{
public function handle(TestEvent $event)
{
//事件处理
//读取事件中注入的对象中的属性
Log::info($event->user->username);
// return false; //在handle中return false会停止事件传播
}
}
2.队列监听器
继承ShouldQueue接口后,执行到这个监听器时会自动使用队列系统
执行成功会从队列中移除
执行失败时如果配置了failed()方法则调用这个方法来处理错误
path:App\Listeners\TestEventListener
class TestEventListener implements ShouldQueue{
use InteractsWithQueue; //用来手动操作队列的trait
public $connection = 'dl'; //任务应该发送到的队列的连接的名称
public $queue = 'listeners'; // 任务应该发送到的队列的名称
public function handle(TestEvent $event)
{
//事件处理
//读取事件中注入的对象中的属性
Log::info($event->user->username);
// return false; //在handle中return false会停止事件传播
if (true) {
$this->release(30); //手动操作
}
}
//处理队列任务执行失败
public function failed(OrderShipped $event, $exception)
{
Log::error('执行失败');
}
}
3.绑定事件监听器
path:App\Providers\EventServiceProvider
//绑定事件和监听器
protected $listen = [
'App\Events\TestEvent' => [
'App\Listeners\TestEventListener',
],
];
事件订阅者(一对多处理事件)
前面的事件和监听事件是一对一处理,而事件订阅者是指一个类订阅处理多个事件,从而允许你在单个类中定义一些事件处理器
1.创建事件订阅者,注册subscribe方法,监听处理多个事件
path:App\Listeners\TestEventListener
class TestEventListener{
public function onTask(TestEvent $event)
{
//事件处理
//读取事件中注入的对象中的属性
Log::info($event->user->user_nickname);
}
public function subscribe($events)
{
//事件 和对应的处理方法
$events->listen(
'App\Events\TestEvent',
'App\Listeners\TestEventListener@onTask'
);
....
}
}
2.绑定事件订阅者
path:App\Providers\EventServiceProvider
//绑定事件订阅者
protected $subscribe = [\App\Listeners\TestEventListener::class];
触发事件
path:App\Http\Controllers\MemberController
class MemberController extends BaseController{
....
public function test()
{
$user = Member::find(12); //获取用户Model
Event(new \App\Events\TestEvent($user));//触发事件,将用户model传入
}
}