生成事件
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 協議》,轉載必須註明作者和本文連結