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

This package is not auto-updated.

Last update: 2025-04-04 02:09:25 UTC


README

组件Book介绍

    在yii或laravel中,利用事件的这一框架特性,把业务代码按模块整理出一个目录,以提高代码可阅读性...
    以下整篇说明中,laravel框架事件的监听器和yii框架事件的处理器是指同一个内容。组件Book结构示意图如下:

组件示意图

Image text

事件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