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 协议》,转载必须注明作者和本文链接
比前两天那个写了俩 log 调用的强点