PSR-14 事件接口规范学习代码

PSR-14 事件接口规范学习代码

本文编写时间:2024-04-26

需求

1、想学习 PSR-14 事件接口规范
2、通过在 laravel 的代码中查看其效果。
3、我测试的版本 laravel:10.48,
4、说明,其实和框架毫无关系,我在 composer 的仓库随便找了一个实现的库,用 composer require crell/tukio执行下就好。

简单事件代码展示

namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Crell\Tukio\Dispatcher;
use Crell\Tukio\OrderedListenerProvider;

// 这是自定义的事件类。
class MyEventSimple {

    protected $eventString;

    public function __construct( string $s )
    {
        $this->eventString = $s;
    }

    public function getEventString()
    {
       return $this->eventString;
    }
}

/**
 * 这是控制器。
 */
class EventSimpleController extends Controller
{
    public function test(Request $request)
    {
        // 监听器提供者。必须实现了PSR-14的框架。
        $provider = new OrderedListenerProvider();

        // 事件,是任意类型的。
        $event = new MyEventSimple( 'event a happend!' );

        // 这是监听器,匿名的。
        $provider->listener(function(MyEventSimple $event) {
            echo $event->getEventString() ."<br>";
        });
        // 再定义一个监听器,匿名的。
        $provider->listener(function(MyEventSimple $event) {
            $temp = substr( $event->getEventString(),0,1 );
            $temp = str_repeat( $temp,10 );
            echo $temp ."<br>";
        });

        // 分发器,必须继承框架。实现了PSR-14的框架
        $dispatcher = new Dispatcher($provider);
        // 分发器分发事件。
        $dispatcher->dispatch( $event );

        return 'event simple ok';
    }
}

执行如下:

event a happend!
eeeeeeeeee
event simple ok

带停止事件的代码展示

namespace App\Http\Controllers\Api;
use Crell\Tukio\Dispatcher;
use Crell\Tukio\OrderedListenerProvider;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Psr\EventDispatcher\StoppableEventInterface;

// 这是自定义的事件类。可终止的。
class MyEvent implements StoppableEventInterface{

    protected $eventString;

    protected $sign;

    public function __construct( string $s )
    {
        $this->eventString = $s;
        $this->sign = false;
    }

    public function getEventString()
    {
       return $this->eventString;
    }

    // 自己写的。
    public function willStop(){
        $this->sign=true;
    }

    // 正常是false,为真表示后续的监听器不执行。
    public function isPropagationStopped() : bool
    {
        return $this->sign;

    }

}

/**
 * 这是控制器。
 */
class EventController extends Controller
{
    public function test(Request $request)
    {
        // 监听器提供者。必须实现了PSR-14的框架。
        $provider = new OrderedListenerProvider();

        // 事件,是任意类型的。但为了可终止,实现了可终止接口。
        $event = new MyEvent( 'event a happend!' );

        // 这是监听器,匿名的。权重数字越大,越先执行。
        $provider->listener(function(MyEvent $event) {
            echo $event->getEventString() ."<br>";
        }, priority: 10);
        // 再定义一个监听器,匿名的。
        $provider->listener(function(MyEvent $event) {
            $temp = substr( $event->getEventString(),0,1 );
            $temp = str_repeat( $temp,10 );
            echo $temp ."<br>";
            $event->willStop();
        }, priority: 20);

        // 分发器,必须继承框架。
        $dispatcher = new Dispatcher($provider);
        // 分发器分发事件。
        $dispatcher->dispatch( $event );

        return 'event ok';
    }
}

执行如下:

eeeeeeeeee
event ok

总结:
1、如果事件不需停止,则事件类不需实现规定的接口。
2、监听器顺序权重之类,由实现框架自己决定,我们使用者只需按实现框架来就好了,这个PSR接口是没有统一规定的。
3、其实PSR-14只有3个接口,过于简单了。真正的实现框架做的还是比较复杂的,为了应对各种情况。

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1
zds

比前两天那个写了俩 log 调用的强点

2个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
55
粉丝
10
喜欢
62
收藏
100
排名:531
访问:1.5 万
私信
所有博文
社区赞助商