前言:
最近在学习 laravel 框架,学习的版本是 7.15.0 ,记录一下学习过程中遇到的问题和难点以及一些总结。
注册事件/监听器
事件类通常存放在 app/Events 目录,监听器存放在 app/Listeners,初始化框架的时候这些目录并不存在,在服务提供者中 EventServiceProvider 中创建事件,运行 Artisan 命令会自动生成事件和监听器所在的目录。
在 App/Providers/EventServiceProvider.php 中添加一个新的 listen 属性包含了事件(键)和对应监听器(值)数组。
/**
* 应用的事件监听器映射
* @var array
*/
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
//添加测试的应用的事件监听器映射
'App\Events\TestEvent' => [
'App\Listeners\TestListener',
],
];
生成事件/监听器类
在终端中运行如下命令可以直接生成事件和监听器。已经存在的不会再重复生成。
php artisan event:generate
在项目中会自动生成文件和所在的目录 Events、Listeners。
实际使用
在 TestEvent.php 进行定义事件。
这里用的是调用一个 AdminModel 类,进行查询 admin 用户表中的数据。
<?php
namespace App\Events;
use App\Http\Model\Admin\AdminModel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class TestEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* @var AdminModel
*/
private $admin;
/**
* 构造方法类
* @return void
*/
public function __construct(AdminModel $admin)
{
$this->admin = $admin;
}
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
/**
* @return mixed
*/
public function getUserOne()
{
return $this->admin->first();
}
/**
* @return mixed
*/
public function getUserTwo()
{
return $this->admin->limit(2)->get();
}
}
在 TestListener.php 进行事件监听。
<?php
namespace App\Listeners;
use App\Events\TestEvent;
class TestListener
{
/**
* Create the event listener.
* @return void
*/
public function __construct()
{
//
}
/**
* 处理事件监听,依赖注入的方式,注入任何你需要的类。
* @param Test $event
* @return void
*/
public function handle(TestEvent $event)
{
//调用事件Event中的方法
// return $event->getUserOne();
return $event->getUserTwo();
//return true;//false 可以阻止事件继续传播
}
}
在控制器中实际使用,直接调用事件 TestEvent。
<?php
namespace App\Http\Controllers;
use App\Events\TestEvent;
use App\Http\Model\Admin\AdminModel;
use Illuminate\Routing\Controller as BaseController;
class TestEventController extends BaseController
{
public function action(AdminModel $admin)
{
//调用 TestEvent 中的事件监听方法,触发事件定义-》监听-》执行
$data = event(new TestEvent($admin));
return response()->json(['code'=>1,'data'=>$data]);
}
}
这只是一个事件从定义到监听再到事件使用中的小例子,在后续的项目开发中如果用到再继续深入的学习。