1.创建事件
在app下创建event文件夹,新建RegisterMessage.php文件
或者通过php artisan event:generate 和 php artisan make:event 两个中任意一个命令来创建Events目录,用于存放事件类
<?php
namespace App\Event;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Cache;
class RegisterMessage
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $user;
/**
* Create a new event instance
*
* @return void
*/
public function __construct($user)
{
$this->user = $user;
}
/**
* Get the channels the event should broadcast on.
*
* @return PrivateChannel
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
2.创建侦听器
在app下创建Listeners文件夹,新建SendMessage.php文件
或者通过php artisan event:generate 和 php artisan make:listener 两个中任意一个命令来创建Listeners目录,存放所有处理事件的类,事件侦听器
<?php
namespace App\Listeners;
use App\Event\RegisterMessage;
use Illuminate\Support\Facades\Cache;
class SendMessage
{
/**
* Create the event listener .
*
* @return void
*/
public function __construct()
{
}
/**
* Handle the event
*
* @param RegisterMessage $event
* @return void
*/
public function handle(RegisterMessage $event)
{
Cache::add('name', $event->user['name']); //拿到事件里的user变量
}
}
3.绑定事件与监听器
在app\Providers下的EventServiceProvider.php中添加我们定义的事件与监听器
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
'App\Event\RegisterMessage' => [
'App\Listeners\SendMessage'
]
];
4.在路由中使用事件
Route::get('listeners', function () {
$user = ['name' => 'peter'];
event(new \App\Event\RegisterMessage($user));
return 'ok';
});
当我们访问/listeners路由时,会把$user变量传给事件,会执行构造方法,同时监听器也会执行handle方法
在storage目录下可以看到两个缓存文件,说明事件和监听器起作用了