Laravel 事件处理


事件提供了一个简单的观察者实现,它允许用户订阅和监听在 Web 应用程序中触发的各种事件。 Laravel的所有事件类都保存在app/Events文件夹中,而监听器则保存在app/Listeners文件夹中。

在 Web 应用程序中生成事件和监听器的 artisan 命令如下:

php artisan event:generate

如上所述,此命令为相应的文件夹生成事件和监听器。

Event Generator

事件和监听器是一种很好的解耦 Web 应用程序的方式,因为一个事件可以有多个彼此独立的监听器。 由artisan命令创建的事件文件夹包括以下两个文件:event.php 和 SomeEvent.php,如下所示:

Event.php

<?php
namespace App\Events;
abstract class Event{
    //
}

如上所述,event.php包括类Event的基本定义和对命名空间App/Events的调用。请注意,用户自定义的事件是在这个文件中创建的。

SomeEvent.php

<?php

namespace App\Events;

use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class SomeEvent extends Event{
    use SerializesModels;
    /**
        * Create a new event instance.
        *
        * @return void
    */
   
    public function __construct() {
        //
    }
   
    /**
        * Get the channels the event should be broadcast on.
        *
        * @return array
    */
   
    public function broadcastOn() {
        return [];
    }
}

请注意,此文件使用序列化在 Web 应用程序中广播事件,并且必要的参数也在此文件中进行了初始化。

例如,如果我们需要在构造函数中初始化 order 变量来注册一个事件,我们可以通过以下方式进行:

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

监听器

监听器处理所有被注册的事件中提到的活动,artisan命令event:generateapp/listeners目录下创建监听器,监听器文件夹包含一个EventListener.php文件,它拥有处理监听器所需的所有方法。

EventListener.php

<?php

namespace App\Listeners;

use App\Events\SomeEvent;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class EventListener{
    /**
        * Create the event listener.
        *
        * @return void
    */
   
    public function __construct() {
        //
    }

    /**
        * Handle the event.
        *
        * @param SomeEvent $event
        * @return void
    */
   
    public function handle(SomeEvent $event) {
        //
    }
}

如代码中所述,它的handle()方法用于管理各种事件的处理,我们可以针对单个事件创建各种独立监听器。