Php 具有简单依赖项注入和解耦的事件处理

Php 具有简单依赖项注入和解耦的事件处理,php,events,dependency-injection,event-handling,Php,Events,Dependency Injection,Event Handling,我正在为教育目的开发一个MVC框架。现在,我一直在思考如何处理框架中的事件 我一直在寻找的最接近的答案是,但它没有说任何关于注射部分的内容 我的问题是,这两种方法都足够好吗?它们是解耦的吗 该语言是PHP,但将其视为伪代码 第一个例子是C#方法ClassA注入了内核类,它自己负责订阅事件 class Kernel{ public $onInit = new EventHandler(); public $onTerminate = new EventHandler();

我正在为教育目的开发一个MVC框架。现在,我一直在思考如何处理框架中的事件

我一直在寻找的最接近的答案是,但它没有说任何关于注射部分的内容

我的问题是,这两种方法都足够好吗?它们是解耦的吗

该语言是PHP,但将其视为伪代码

第一个例子是C#方法
ClassA
注入了
内核
类,它自己负责订阅事件

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);
  }
}
我倾向于第二种方法,因为它更干净,但我不确定它是否“走对了路”(处理事件)


非常感谢您的帮助。

我认为第二种方法更好,因为第一种方法对EventHandler的实现产生了依赖性,这种依赖性并不明显,而且很难扩展或替换

我认为第二种方法更好,因为第一种方法创建了对EventHandler实现的依赖性,这种依赖性并不明显,而且很难扩展或替换

第二次进近时也为+1。第一种方法在EventHandler上创建未发布的依赖项。。。这个框架是面向大众还是面向私人观众?现在我的框架的主要目标是学习新东西(我学到了很多;设计模式、依赖注入等等)。我想让它开源,但这取决于我对结果(代码)的满意程度。谢谢你的投入。让它开源。。。让别人贡献。。。这只会扩展学习…我可能会这样做,因为很难找到遵循良好编程习惯的简单php框架。如果你决定,请在这里发布详细信息。。。你引起了我的兴趣。第二种方法也是+1。第一种方法在EventHandler上创建未发布的依赖项。。。这个框架是面向大众还是面向私人观众?现在我的框架的主要目标是学习新东西(我学到了很多;设计模式、依赖注入等等)。我想让它开源,但这取决于我对结果(代码)的满意程度。谢谢你的投入。让它开源。。。让别人贡献。。。这只会扩展学习…我可能会这样做,因为很难找到遵循良好编程习惯的简单php框架。如果你决定,请在这里发布详细信息。。。你引起了我的兴趣。