📜  laravel 事件监听器 - PHP (1)

📅  最后修改于: 2023-12-03 14:43:46.583000             🧑  作者: Mango

Laravel 事件监听器 - PHP

Laravel 提供了强大的事件系统,让我们可以在应用程序中实现事件与监听器。事件监听器是一个响应事件的类,当事件被触发时,监听器将会执行对应的方法。

创建事件

要创建一个事件,只需要创建一个继承自 Illuminate\Foundation\Events\Event 的类,并在类中定义必要的属性/方法。

示例:

<?php

namespace App\Events;

use Illuminate\Foundation\Events\Event;

class OrderShipped extends Event
{
    public $order;

    public function __construct($order)
    {
        $this->order = $order;
    }
}

在上面的示例中,我们创建了一个 OrderShipped 事件,并定义了一个 $order 属性和构造函数。在实例化 OrderShipped 事件时,我们可以为 $order 属性传递一个值。

创建监听器

要创建一个监听器,只需要创建一个类并实现 Laravel 的 ShouldQueue 接口和 handle 方法即可。

示例:

<?php

namespace App\Listeners;

use App\Events\OrderShipped;

class SendShipmentNotification implements ShouldQueue
{
    public function handle(OrderShipped $event)
    {
        //
    }
}

在上面的示例中,我们创建了一个 SendShipmentNotification 监听器,并定义了一个 handle 方法。handle 方法接收一个 OrderShipped 事件,并且在事件触发时自动执行。

注册事件监听器

要注册事件监听器,只需要在 EventServiceProvider 类中的 $listen 属性中定义该事件的监听器。

示例:

<?php

namespace App\Providers;

use App\Events\OrderShipped;
use App\Listeners\SendShipmentNotification;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    protected $listen = [
        OrderShipped::class => [
            SendShipmentNotification::class,
        ],
    ];

    public function boot()
    {
        parent::boot();

        //
    }
}

在上面的示例中,我们注册了 OrderShipped 事件,并且将 SendShipmentNotification 监听器与该事件关联。

触发事件

要触发事件,只需要在适当的地方使用 event 函数并传递事件对象即可。

示例:

<?php

namespace App\Http\Controllers;

use App\Events\OrderShipped;

class OrderController extends Controller
{
    public function ship($orderId)
    {
        $order = Order::find($orderId);

        // 订单发货处理...

        event(new OrderShipped($order));

        return redirect('/orders');
    }
}

在上面的示例中,我们使用 event 函数触发了 OrderShipped 事件,并将 $order 对象传递给事件的构造函数。

总结

以上就是 Laravel 事件监听器的使用方法,通过事件系统和监听器的组合可以让我们的应用程序更加强大和灵活。