好处:
关注的事件不用一个个去注册。 取消关注的事件不用一个个去移除注册。订阅者内部关注的事件是一个整体,要么全部关注要么全部不关注
实例
普通栗子
include "vendor/autoload.php";
use SymfonyComponentEventDispatcherEventDispatcher;
use SymfonyComponentEventDispatcherEvent;
class UserEvent extends Event
{
public function name()
{
return "Cartman";
}
public function age()
{
return "24";
}
}
$dispatcher = new EventDispatcher();
$dispatcher->addListener("user.name", function($event, $eventName, $dispatcher){
echo "My name is Cartmann";
});
$dispatcher->addListener("user.name", function($event, $eventName, $dispatcher){
echo "My name is {$event->name()} from Event instancen";
}, 10);
$dispatcher->addListener("user.age", function($event, $eventName, $dispatcher){
echo "My age is 24n";
}, 10);
$dispatcher->addListener("user.age", function($event, $eventName, $dispatcher){
echo "My age is {$event->age()} from Event instancen";
}, -10);
$dispatcher->dispatch("user.name", new UserEvent());
$dispatcher->dispatch("user.age", new UserEvent());
上面的例子输出
My name is Cartman from Event instance My name is Cartman My age is 24 My age is 24 from Event instance
事件订阅者栗子
通过Subscriber注册事件
include "vendor/autoload.php";
use SymfonyComponentEventDispatcherEventDispatcher;
use SymfonyComponentEventDispatcherEvent;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
class BookEvent extends Event
{
public $name = self::class;
}
class BookSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
"chinese.name" => "chineseNameShow",
"english.name" => [
["englishNameShow", -10],
["englishNameAFter", 10],
],
"math.name" => ["mathNameShow", 100]
];
}
public function chineseNameShow(Event $event)
{
echo "我是汉语书籍n";
}
public function englishNameShow(Event $event)
{
echo "我是英文书籍n";
}
public function englishNameAFter(Event $event)
{
echo "我是展示之后的英文书籍[来自于Event实例{$event->name}]n";
}
public function mathNameShow(Event $event)
{
echo "我是展示的数学书籍n";
}
}
$dispatcher = new EventDispatcher();
$subscriber = new BookSubscriber();
$dispatcher->addSubscriber($subscriber);
$dispatcher->dispatch("english.name", new BookEvent());
$dispatcher->dispatch("chinese.name");
$dispatcher->removeSubscriber($subscriber);
$dispatcher->dispatch("math.name");
输出为内容:
我是展示之后的英文书籍[来自于Event实例BookEvent] 我是英文书籍 我是汉语书籍
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持易采站长站!







