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 方法中,所以我们只需在该方法中作业务方面的处理即可