📅  最后修改于: 2023-12-03 14:43:46.583000             🧑  作者: Mango
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 事件监听器的使用方法,通过事件系统和监听器的组合可以让我们的应用程序更加强大和灵活。