1、使用目的:简化代码,让需求逻辑异步执行2、同步事件操作步骤1、新建事件phpartisanmake:eventUserLoginnamespaceApp\Events;useIlluminate\Broadcasting\Channel;useIlluminate\Broadcasting\InteractsWithSockets;使用Illuminate\Broadcasting\PresenceChannel;使用Illuminate\Broadcasting\PrivateChannel;使用Illuminate\Contracts\Broadcasting\ShouldBroadcast;使用Illuminate\Foundation\Events\Dispatchable;使用Illuminate\Queue\SerializesModels;监听器将使用public$data;/***创建一个新的事件实例。**@returnvoid*/publicfunction__construct($data){$this->data=$data;}/***获取事件应该广播的频道。**@return\Illuminate\Broadcasting\Channel|array*/publicfunctionbroadcastOn(){returnnewPrivateChannel('userLogin');}}2.事件监听app/Providers/EventServiceProvider.phpnamespaceApp\Providers;使用App\Events\UserLogin;使用Illuminate\Auth\Events\Registered;使用Illuminate\Auth\Listeners\SendEmailVerificationNotification;使用Illuminate\Foundation\Support\Providers\EventServiceProvider作为服务提供者;使用Illuminate\Support\Facades\Event;类EventServiceProviderextendsServiceProvider{/***应用程序的事件侦听器映射。**@vararray*/protected$listen=[Registered::class=>[SendEmailVerificationNotification::class,],//用户登录成功后的事件处理UserLogin::class=>['App\Listeners\UserLogin\WriteLog',//记录日志操作'App\Listeners\UserLogin\ActiveOperate',//主动操作]];/***为您的应用程序注册任何事件。**@returnvoid*/publicfunctionboot(){parent::boot();//}}3.生成监听器。phpartisanevent:generate命令执行后,会生成两个配置文件app/Listeners/UserLogin/ActiveOperate.phpapp/Listeners/UserLogin/WriteLog.phpActiveOperate.php代码显示命名空间App\Listeners\UserLogin;useApp\Events\UserLogin;useIlluminate\Contracts\Queue\ShouldQueue;useIlluminate\Queue\InteractsWithQueue;classActiveOperate{/***创建事件监听器.**@returnvoid*/publicfunction__construct(){//}/***处理事件。**@paramUserLogin$event*@returnvoid*/publicfunctionhandle(UserLogin$event){//$event接收事件属性方法info('ActiveOperate'.json_encode($event->data,JSON_UNESCAPED_UNICODE));}}4.创建controllerphpartisanmake:controllerUserloginController在controller命名空间App\Http\Controllers;useApp\Events\UserLogin;useIlluminate\Http\Request;useIlluminate\Support\Facades\Event;class中调用事件UserControllerextendsController{publicfunctionlogin(Request$request){var_dump('代码操作逻辑');$data=['id'=>'1','用户名'=>'测试名'];//事件分发event(newUserLogin($data));}}访问控制器方法,注册的事件将被调用[2021-05-1606:07:23]local.INFO:ActiveOperate{"id":"1","username":"testname"}[2021-05-1606:07:23]local.INFO:ActiveOperate{"id":"1","username":"testname"}5。RequiredThingstoattention1)event的作用:作为中间桥梁,将controller中的数据传递给listener,也就是传递命令的人。事件是实际的worker4)执行过程还是同步执行,所有监听器都执行完controller会返回response。三、异步执行事件1、操作:listener继承ShouldQueue,添加实现方法和缓存key/***任务发送到队列的连接名**@varstring|null*/public$connection='redis';/***任务将发送到的队列的名称**@varstring|null*/public$queue='UserLogin:WriteLog';添加异步后,事件不会同步执行,只会执行controller方法,事件等待后台任务处理。2、执行1)访问controller方法,可以看到对应的log并没有产生新的日志文件内容存储在redis中,使用list存储,key中包含了我们定义的一些key,以及存储的数据是对象信息2)调用phpartisan执行队列phpartisanqueue:work--queue=UserLogin:ActiveOperatephpartisanqueue:work--queue=UserLogin:WriteLog3)Executingqueue:work单独无法执行,必须指定单独的队列名,没找到原因
