events / book
write events code like book with laravel or yii
This package's canonical repository appears to be gone and the package has been frozen as a result.
V1.0.7
2020-10-13 03:42 UTC
Requires
- php: >=7.0.0
This package is not auto-updated.
Last update: 2025-04-04 02:09:25 UTC
README
组件Book介绍
在yii或laravel中,利用事件的这一框架特性,把业务代码按模块整理出一个目录,以提高代码可阅读性...
以下整篇说明中,laravel框架事件的监听器和yii框架事件的处理器是指同一个内容。组件Book结构示意图如下:
组件示意图
事件Event
1.事件必须继承Book\Laravel\Event或Book\Yii\Events\Event
2.事件属性
(1)protected $response:从事件返回到book的数据;
(2)protected $request:接受到的请求数据;
(3)protected $coupling:事件监听器间耦合数据。
(4)public $ctr:控制器
3.事件方法
(1)$event->request:返回Illuminate\Http\Request $request
(2)$event->response($key=null,$val=null)查询或设置响应数据:
key和val为null则代表没有指定,各种数据类型的空,不包括null;
没有指定key和val,则返回响应数据;
没有指定key但指定了val,则响应数据被赋值为val;
指定key没有指定val,则查询对应key下的值;
指定key且指定val,则设置对应key的值为val。
(3)$event->coupling($key=null,$val=null)查询或设置耦合数据:
key和val为null则代表没有指定,各种数据类型的空,不包括null;
没有指定key和val,则返回响应数据;
没有指定key但指定了val,则响应数据被赋值为val;
指定key没有指定val,则查询对应key下的值;
指定key且指定val,则设置对应key的值为val。
(4)数据操作支持点语法
(5)$event->stop():
完成处理当前监听器并停止处理后续监听器
(6)$event->next():
跳过当前监听器后续处理,继续执行下一个监听器
(7)$event->error($errorCode,$errorMsg,[$debugErrorMsg]):
事件出错,中断当前监听器后续处理,以及停止处理后续监听器
$errorCode:错误码
$errorMsg:错误提示
$debugErrorMsg:非正式环境错误提示,环境变量为'local','dev','test'
(8)$event->rule($request,$rule) 参数校验
(9)$event->destroyPage($data) 销毁laravel自带分页多余的字段
4.监听器代码复用
如果同一事件的监听器有代码复用,可以把代码封装在事件中进行复用
5.laravel中:
(1)引用了Illuminate\Foundation\Validation\ValidatesRequests功能
laravel中安装使用教程
1.安装依赖
composer require events/book ^1.0
2.在config/app.php下注册Provider
Book\Laravel\Provider\BookServiceProvider::class
3.Controller下写入事件与监听器
<?php
namespace App\Http\Controllers\Visite;
use Illuminate\Routing\Controller;
use Book\Laravel\Book;
use Illuminate\Http\Request;
class TestController extends Controller{
public function test(Request $request){
return Book::write([
'App\Events\User'=>[
'App\Listeners\User',
'App\Listeners\User'.'@visiter',
]
],$this,$request);
}
}
4.编写事件Test
<?php
namespace App\Events;
use Book\Laravel\Event;
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;
use Illuminate\Http\Request;
class Test extends Event
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Get the channels the event should broadcast on.
*
* @return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
public function __construct(Request $request)
{
parent::__construct($request);
}
}
5.编写监听器TestListener
<?php
namespace App\Listeners;
use App\Events\Test;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class TestListener
{
/**
* Handle the event.
* @param Test $event
* @return void
*/
public function handle(Test $event)
{
print_r($event->request->input('key'));
}
/**
* Handle the event.
* @param Test $event
* @return void
*/
public function test(Test $event)
{
echo 2;
}
}
yii中安装使用教程
1.安装依赖
composer require events/book ^1.0
2.Controller下写入事件与监听器
<?php
namespace App\Http\Controllers\Visite;
use Book\Yii\Controllers\Controller;
class TestController extends Controller{
public function test(){
return $this->write([
'App\Events\User'=>[
'App\Listeners\User',
'App\Listeners\User'.'@visiter',
]
],$this);
}
}
3.编写事件Test
<?php
namespace app\events;
use Book\Yii\Events\Event;
class Test extends Event
{
}
4.编写处理器TestHandler
<?php
namespace app\handlers;
use app\events\Test;
class TestListener
{
/**
* Handle the event.
* @param Test $event
* @return void
*/
public function handle(Test $event)
{
print_r($event->request());
}
/**
* Handle the event.
* @param Test $event
* @return void
*/
public function test(Test $event)
{
echo 2;
}
}
注意事项
1.请求数据
(1)laravel中,请求数据request保留laravel框架的格式。
(2)yii中,请求数据request解析为数组。
2.响应数据
(1)事件监听器(处理器)单独设置事件的响应数据
(2)所有事件的响应数据将整合在一起作为请求的响应数据。所以应避免不同事件之间的响应数据的键冲突。
(3)请求的响应数据,默认是json格式返回。
3.编写原则
(1)需要耦合的业务模块,都写到同一事件中。事件之间脱耦。
(2)监听器(处理器)只针对事件进行处理,不针对Book进行处理。
(3)由于事件之间脱耦,事件将并行触发执行,以提高代码执行效率。
4.异常捕获
(1)组件Book在trigger()下有对所有监听器的异常进行捕获。
(2)非正式环境下,捕获到的异常信息将被抛出来,正式环境下,接口响应错误码为:-1,错误信息为:服务器异常,
请联系管理员
5.自动生成事件问题
在laravel中,由于事件和监听器可以使用artisan命令快速生成,但是前提是在EventServiceProvider中有声明。
而该用该组件开发会产生大量的事件与监听器,所以尽量避免使用命令快速生成,或快速生成后删除声明的内容,以减少框架
的初始化内容。使用该组件会动态生成当前请求所需的事件与监听器。
5.数据库事务
(1)组件Book在trigger()下默认已经开启数据库事务
(2)不需要默认开启数据库事务,则将Book::write(array $relation,$request,$tran=true)的tran参数设置为
false。
6.默认监听器(处理器)
不指定监听器(处理器)的方法时,默认是handle