laravel - 事件系统案例

理解 : 通过订阅者模式实现对应用中事件的监听和订阅。是一种很好的功能或应用间的解耦方式。

相关目录 :  

注册监听事件和订阅事件的文件: App\Providers\EventServiceProvider
事件所在目录 :App\Events
监听订阅事件的动作所在目录 : App\Listeners

事件监听 - 同步操作小案例

  1. 创建一个叫Demo的事件,对应App\Events\Demo.php
	php artisan make:event Demo

文件内容:

<?php

	namespace App\Events;
	
	use Illuminate\Broadcasting\Channel;
	use Illuminate\Queue\SerializesModels;
	use Illuminate\Broadcasting\PrivateChannel;
	use Illuminate\Broadcasting\PresenceChannel;
	use Illuminate\Foundation\Events\Dispatchable;
	use Illuminate\Broadcasting\InteractsWithSockets;
	use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

	class Demo
	{
	    use Dispatchable, InteractsWithSockets, SerializesModels;
	
	    /**
	     * Create a new event instance.
	     *
	     * @return void
	     */
	    public function __construct()
	    {
	        //
	    }
	
	    /**
	     * Get the channels the event should broadcast on.
	     *
	     * @return \Illuminate\Broadcasting\Channel|array
	     */
	    public function broadcastOn()
	    {
	        return new PrivateChannel('channel-name');
	    }
	}

  1. 注册这个事件,进入到EventServiceProvider文件中找到$listen属性
	// key是事件命名空间,数组中的元素是 监听器的命名空间。
    protected $listen = [
        "App\Events\Demo" => [
            "App\Listeners\DemoEventListener",
            "App\Listeners\Demo1EventListener",
        ]
    ];
  1. 生成事件对应的事件监听器,执行下面命令会根据注册的内容在Listeners中生成对应文件
php artisan event:generate

文件内容 : 在handle方法中写我们的监听到事件后的逻辑

	<?php
	
	namespace App\Listeners;
	
	use App\Events\Demo;
	use Illuminate\Queue\InteractsWithQueue;
	use Illuminate\Contracts\Queue\ShouldQueue;
	
	class Demo1EventListener implements ShouldQueue
	{
	
	    /**
	     * Create the event listener.
	     *
	     * @return void
	     */
	    public function __construct()
	    {
	        //
	    }
	
	    /**
	     * Handle the event.
	     *
	     * @param  Demo  $event
	     * @return void
	     */
	    public function handle(Demo $event)
	    {
	        echo "我是 同步事件 demo1 <br/>";
	    }
	}

  1. 控制器中分发事件
<?php

namespace App\Http\Controllers;

use App\Events\Demo;
use Illuminate\Http\Request;

class MovieController extends Controller
{
    public function demo()
    {
        // 业务逻辑

        // 分发事件
        event( new Demo() );

    }
}

  1. 分发事件后的效果

在这里插入图片描述

事件监听 - 异步操作小案例

理解 :异步操作就是将事件监听器放入到队列中去执行。要指定监听器启动队列,只需将 ShouldQueue 接口添加到监听器类。由 Artisan 命令 event:generate 生成的监听器已经将此接口导入到当前命名空间中,因此你可以直接使用它

官方提示 : 如果你的监听器中要执行诸如发送邮件或者进行 HTTP 请求等比较慢的任务,你可以选择将其丢给队列处理。
在开始使用监听器队列之前,请确保在你的服务器或本地开发环境中能够配置并启动 队列 监听器

.

1 . 继承 shouldQueue 接口。并开启队列。

demo1 文件 :
在这里插入图片描述
demo 文件 :继承shouldQueue 接口 并定义延迟5秒执行。
在这里插入图片描述
开启队列: php artisan queue:work

分发事件后的效果 :
在这里插入图片描述
总结 :
继承了 shouldQueue 接口, 可以定义失败方法failed()来处理队列失败后的操作。
如果有需要也可以将队列使用的 trait类 拿过来有用,这样队列中的操作,这里就都可以使用了。

事件订阅 - 同步订阅者的使用

  1. 创建订阅者类
	<?php
	
	namespace App\Listeners;
	
	use App\Events\Demo;
	use Illuminate\Queue\InteractsWithQueue;
	use Illuminate\Contracts\Queue\ShouldQueue;
	
	class DemoEventSubscriber
	{
	    /**
	     * Create the event listener.
	     *
	     * @return void
	     */
	    public function __construct()
	    {
	        //
	    }
		// 对应subscribe方法中订阅的事件。
	    public function onDemo1($event)
	    {
	        echo "我是订阅者2";
	    }
		// 对应subscribe方法中订阅的事件。
	    public function onDemo2($event)
	    {
	        echo "我是订阅者2";
	    }
	
	    public function subscribe($events)
	    {
	    	// onDemo2方法订阅Demo事件,
	        $events->listen(
	            'App\Events\Demo',
	            'App\Listeners\DemoEventSubscriber@onDemo2'
	        );
			// onDemo1方法订阅Demo1事件,
	        $events->listen(
	            'App\Events\Demo1',
	            'App\Listeners\DemoEventSubscriber@onDemo1'
	        );
	    }
	
	}

  1. 注册订阅者 :在EventServiceProvider的$subscribe属性注册
	/**
     * 需要注册的订阅者类。
     *
     * @var array
     */
    protected $subscribe = [
        'App\Listeners\DemoEventSubscriber',
    ];
  1. 分发事件 :控制器中分发
	public function demo()
    {
        // 业务逻辑

        // 分发事件
        event( new Demo() );

    }
  1. 分发事件后的效果
    在这里插入图片描述

事件订阅 - 异步订阅者的使用

和上面异步使用监听器一样,继承 ShouldQueue 接口并开启队列就可以了。

直接看效果:
在这里插入图片描述

总结 事件订阅 与 事件监听的区别

每个事件均可有多个监听器,但是一个监听器只能监听一个事件。如果想在一个类中监听多个事件,就需要适用事件订阅者。

猜你喜欢

转载自blog.csdn.net/qq_42872677/article/details/106682635