事件和监听器概念
事件:执行某个动作或者处理某件事情,例如“发货”。
监听器:监听某个事件的发生,从而触发对应的一系列动作,例如发货后给用户发送一条“已发货”的通知短信、增加发货数量的统计数据等。
通常来说,一个事件可以对应多个监听器,但一个监听器只监听一个事件。
主要目录
- app/Events:存放事件类的目录
- app/Listeners:存放监听器类的目录
- App/Providers/EventServiceProvider:事件服务提供者,用于注册事件监听器
声明事件和监听器的绑定关系
首先在事件服务提供者中声明事件和监听器的绑定关系:
protected $listen = [
// 订单发货事件
'App\Events\OrderShipped' => [
// 发送发货通知的监听器
'App\Listeners\SendShipmentNotification',
// 增加发货数量的监听器
'App\Listeners\AddShipmentCount',
],
];
然后,就可以使用命令生成对应的事件和监听器文件:
php artisan event:generate
Laravel 提供了自动事件发现功能,其原理是通过反射扫描 app/Listeners 监听器目录来查找事件监听器,然后通过事件监听器的依赖注入类型来查找事件绑定关系进行注册。该功能默认关闭,使用前需在 EventServiceProvider 中手动开启。
定义事件
<?php
namespace App\Events;
use App\Models\Order;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class OrderShipped
{
use Dispatchable, InteractsWithSockets, SerializesModels;
// 分发事件时传入的对象
public $order;
public function __construct(Order $order)
{
$this->order = $order;
}
}
定义监听器
<?php
namespace App\Listeners;
use App\Models\User;
use App\Events\OrderShipped;
class SendShipmentNotification
{
private $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function handle(OrderShipped $event)
{
// 执行发送短信等操作
\Log::info($event->order->id);
}
}
在业务逻辑中触发事件
<?php
namespace App\Http\Controllers;
use App\Events\OrderShipped;
use App\Http\Controllers\Controller;
use App\Models\Order;
class OrderController extends Controller
{
/**
* 订单发货操作
*/
public function ship($orderId)
{
$order = Order::findOrFail($orderId);
// 订单发货逻辑 ...
event(new OrderShipped($order));
// 也可以使用 dispatch 分发
// OrderShipped::dispatch($order);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。