理解 : 通过订阅者模式实现对应用中事件的监听和订阅。是一种很好的功能或应用间的解耦方式。
相关目录 :
注册监听事件和订阅事件的文件: App\Providers\EventServiceProvider
事件所在目录 :App\Events
监听订阅事件的动作所在目录 : App\Listeners
php artisan make:event Demo
文件内容:
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');
}
}
// key是事件命名空间,数组中的元素是 监听器的命名空间。
protected $listen = [
"App\Events\Demo" => [
"App\Listeners\DemoEventListener",
"App\Listeners\Demo1EventListener",
]
];
php artisan event:generate
文件内容 : 在handle方法中写我们的监听到事件后的逻辑
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
";
}
}
namespace App\Http\Controllers;
use App\Events\Demo;
use Illuminate\Http\Request;
class MovieController extends Controller
{
public function demo()
{
// 业务逻辑
// 分发事件
event( new Demo() );
}
}
理解 :异步操作就是将事件监听器放入到队列中去执行。要指定监听器启动队列,只需将 ShouldQueue 接口添加到监听器类。由 Artisan 命令 event:generate 生成的监听器已经将此接口导入到当前命名空间中,因此你可以直接使用它
官方提示 : 如果你的监听器中要执行诸如发送邮件或者进行 HTTP 请求等比较慢的任务,你可以选择将其丢给队列处理。
在开始使用监听器队列之前,请确保在你的服务器或本地开发环境中能够配置并启动 队列 监听器
.
1 . 继承 shouldQueue 接口。并开启队列。
demo1 文件 :
demo 文件 :继承shouldQueue 接口 并定义延迟5秒执行。
开启队列: php artisan queue:work
分发事件后的效果 :
总结 :
继承了 shouldQueue 接口, 可以定义失败方法failed()来处理队列失败后的操作。
如果有需要也可以将队列使用的 trait类 拿过来有用,这样队列中的操作,这里就都可以使用了。
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'
);
}
}
/**
* 需要注册的订阅者类。
*
* @var array
*/
protected $subscribe = [
'App\Listeners\DemoEventSubscriber',
];
public function demo()
{
// 业务逻辑
// 分发事件
event( new Demo() );
}
和上面异步使用监听器一样,继承 ShouldQueue 接口并开启队列就可以了。
每个事件均可有多个监听器,但是一个监听器只能监听一个事件。如果想在一个类中监听多个事件,就需要适用事件订阅者。