Laravel 事件&非同步處理

liaosp發表於2020-12-28

生成事件

php aritsan make:event Test

事件和監聽 listen 是一對多的管理,一個事件對應多個響應事件

定一個$data 屬性,賦值觸發事件時傳遞的資料。

   public $data;
    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($data)
    {
        $this->data = $data;


    }

如何在業務中觸發?

   public function test(){
       Test::dispatch('你好事件');
   }

新增監聽者

php artisan make:listener TestLisenter

namespace App\Lisenter;
use App\Events\Test;
class TestLisenter 
{
    public function handle(Test $test)
    {
        var_dump($test->data);
        //列印:你好事件
    }
}

如何接受 “你好事件?”

這個時候我們要建立, listen 物件來處理業務邏輯

laravel 有提供兩種方案:

方案一:

EventServiceProvider 新增$listen 陣列資訊比如:

/**
 * 應用程式的事件監聽器對映
 *
 * @var array
 */
protected $listen = [
    'App\Events\Test' => [
        'App\Listeners\TestListenter',
    ],
];
方案二:

讓系統自動處理,遍歷指定目錄
需要在EventServiceProvider 新增:

/**
 * 確定是否應自動發現事件和偵聽器
 *
 * @return bool
 */
public function shouldDiscoverEvents()
{
    return true;
}
/**
 * 獲取應該用於發現事件的監聽器的目錄
 *
 * @return array
 */
  protected function discoverEventsWithin()
    {
        return [
            $this->app->path('Lisenter'),//事件關聯的監聽器目錄APP/Lisenters
            $this->app->path('Lisenter/test'),//事件關聯的監聽器目錄APP/Lisenters/test
        ];
    }

系統會自動的匹配Listen

此時, 已經完成了事件的流程。如果沒有成功或者想知道更多事件的處理,比如,延時佇列,判斷是否要加入事件,處理失敗之後的處理等等:參考文件

事件的佇列處理

如果沒有接觸laravel 的佇列的小夥伴,先參考: Laravel Jobs

只需要在 TestLisenter 實現 ShouldQueue 的介面即可

長這樣:

namespace App\Lisenter;
use App\Events\Test;
use Illuminate\Contracts\Queue\ShouldQueue;

class TestLisenter implements ShouldQueue
{
    public function handle(Test $test)
    {
        var_dump($test->data);
        //列印:你好事件
    }
}

和我做朋友?

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章