Laravel 的事件系统

Posted 小伍

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 的事件系统相关的知识,希望对你有一定的参考价值。

事件和监听器概念

事件:执行某个动作或者处理某件事情,例如“发货”。

监听器:监听某个事件的发生,从而触发对应的一系列动作,例如发货后给用户发送一条“已发货”的通知短信、增加发货数量的统计数据等。

通常来说,一个事件可以对应多个监听器,但一个监听器只监听一个事件。

主要目录

  • 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);
    }
}

以上是关于Laravel 的事件系统的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:如何在控制器的几种方法中重用代码片段

laravel5.5学习2-路由系统

Laravel 的事件系统

laravel添加api缓存系统

laravel5.5事件广播系统

Laravel系列7.5事件系统