教育目的で 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){}
}
この 2 番目のアプローチでは、イベントのサブスクライブを担当する中間クラスがあります。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);
}
}
私は 2 番目のアプローチの方がずっとクリーンなので傾いていますが、それが「正しい方向に進んでいる」(イベントの処理) かどうかはわかりません。
どんな助けでも大歓迎です。