我正在开发一个用于教育目的的 MVC 框架。现在我被困在如何处理我的框架中的事件。
我正在寻找的最接近的答案是将事件添加到接口/实现,但它没有说明注入部分的任何内容。
我的问题是,这两种方法都足够好吗?他们是解耦的吗?
该语言是 PHP,但将其视为伪代码。
第一个示例是一种 C# 方法。ClassA
被注入Kernel
类,订阅事件是它自己的责任。
class Kernel{
public $onInit = new EventHandler();
public $onTerminate = new EventHandler();
public function __construct(){
}
public function boot(){
//...dosomething
$this->onInit->raise($this, new EventArgs());
$this->onTerminate->raise($this, new EventArgs());
}
}
class ClassA{
public function __construct($kernel){
$kernel->onInit->add(array($this,'onKernelInit'));
}
public function onKernelInit($sender, $args){
$this->doSomething($sender);
}
public function doSomething(Kernel $kernel){}
}
使用第二种方法,有一个中间类负责订阅事件。ClassAListener
注入ClassA
和KernelEventDispatcher
。
class Kernel{
public $dispatcher;
public function __construct(KernelEventDispatcher $dispatcher){
$this->dispatcher = $dispatcher;
}
public function boot(){
//do something...
$this->dispatcher->raiseInit($this, new EventArgs());
$this->dispatcher->raiseTerminate($this, new EventArgs());
}
}
class ClassAListener{
public function __construct(ClassA $classA, KernelEventDispatcher $dispatcher){
$this->classA = $classA;
$dispatcher->onInit(array($this, 'onKernelInit'));
}
public function onKernelInit($sender, $args){
$classA->doSomething($sender);
}
}
我倾向于第二种方法,因为它更干净,但我不确定它是否“走对了路”(处理事件)。
任何帮助表示赞赏。