Laravel 中的 event(事件)觸發器分發至隊列中進行異步業務/數據處理,那麼這樣之後可以快速做出響應而不用實時等待執行結果之後才能給使用者做出提示消息。
1 設置事件 app->events
/**
* @author Administrator
* @date 2018年11月26日
* @comment
*
*/
class DuplicateDismissEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* 用戶標記
* @var unknown
*/
public $uid;
/**
* 解散產品標記組
* @var unknown
*/
public $pids;
/**
* Create a new event instance.
*
* @return void
*/
public function __construct( $data )
{
$this->uid = $data[ 'uid' ];
$this->pids = $data[ 'pids' ];
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
2 設置事件監聽器 app->Listeners
<?php
/**
*
* @author Administrator
* @date 2018年12月6日
* @comment
*
*/
class DuplicateDismissListener implements ShouldQueue
{
use InteractsWithQueue;
/**
* 任務應該發送到的隊列的連接的名稱
*
* @var string|null
*/
public $connection = QueuesEnums::QUEUE_DRIVER_REDIS_ASYNC;
/**
* 任務應該發送到的隊列的名稱
*
* @var string|null
*/
public $queue = QueuesEnums::QUEUE_NAME_API_RECEIVE_PRODUCTS;
/**
* 任務最大嘗試次數
*
* @var int
*/
public $tries = 2;
/**
* 任務運行的超時時間。
*
* @var int
*/
public $timeout = 500;
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param Event $event
* @return void
*/
public function handle( DuplicateDismissEvent $event )
{
if( !isset( $event->pids ) || !$event->pids )
{
return false;
}
//////////////////////////////////////////////////////////////////////////////////
//業務處理區域
//1 數據處理
//2 清理緩存
//3 完成標記
//4 日誌記錄
return true;
}
/**
* 失敗事件處理器
* @author Administrator
* @datetime 2018年12月6日 下午2:49:36
* @comment
*
* @param DuplicateDismissEvent $event
* @param unknown $exception
*/
public function failed( DuplicateDismissEvent $event, $exception)
{
//
$this->delete();
}
}
3 綁定事件與事件監聽器 app->Providers:EventServiceProvider.php
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Auth\Events\Login' => [ 'App\Listeners\LoginListener' ],
'Illuminate\Auth\Events\Logout' => [ 'App\Listeners\LogoutListener', ],
'App\Events\ApiLogEvent' => ['App\Listeners\ApiLogListener'],
//解散相似事件
'App\Events\DuplicateDismissEvent' => ['App\Listeners\DuplicateDismissListener'],
];
只需要將對應的事件與事件監聽器綁定之後就可以採用 event( new DuplicateDismissEvent( $data ) ) 這種形式去觸發,觸發之後該任務則分發至隊列中進行異步處理。
那麼首先我們可以看到該事件監聽器要做到可以分發隊列必須實現類 ShouldQueue 並且內部引用InteractsWithQueue trait類則是對隊列的入棧、出棧、釋放任務的基本操作:https://laravel.com/api/5.6/Illuminate/Queue/InteractsWithQueue.html
connection 屬性 表示該隊列的執行驅動
queue屬性 表示該任務名稱即隊列名稱
tries屬性 表示該任務失敗重試次數
timeout屬性 表示該任務的超時時長
那麼該隊列執行時會默認分發至 handle 方法中,所以我們只需在該方法中作業務方面的處理即可