2011-08-10 17 views
1

私はCodeigniterに変換しているWebサイトを持っており、簡素化して切り離したいと思っています。私は、「新しい調査が作成されました」(電子メールをトリガする新しいヘルプチケットを起動するなど)のようなオブザーバーパターンについて読んだことが好きです。ObserverパターンをMVC/CodeigniterのWebサイトで使用しています

しかし、このようなことをコードイグナイターに実装するにはどうすればよいですか?私はSymfonyコンポーネントを見ていますが、コントローラとモデルでどのように使用するかを理解するだけで、システムの理解を心配していません。 CI_ModelとCI_Controllerの両方を既に拡張しています。オブザーバーのパターンコードを置くのがベストでしょうか?

私はこのような点を想像:誰かがウェブサイトにヒットし、コントローラ/アクションにルーティングされる要求を生成します:http://localhost/test/save_changes

// warning, pseudo-code! 

class Test extends MY_Model 
{ 
    public function __construct() 
    { 
     // do I put this here?!? - or maybe in MY_Model? 
     // Should it be a singleton? 
     $this->load->library('dispatcher'); 
     // where do I attach what I want... here? 
     $this->load->library('emailer'); 
     $this->dispatcher->attach($this->emailer); 
     // what if I have 50 possible things that might happen 
     // based on any given event, from adding a user to 
     // deleting a survey or document? There has got to be a 
     // way to attach a bunch of observers that trickle 
     // down to each object, right? 
    } 

    public function save_changes() 
    { 
     $this->load->model('user'); 
     $this->user->init($this->session->userdata('user.id'))->save();    
    } 
} 



class User extends MY_Model 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
     // do I put this here?!? 
     $this->load->library('dispatcher'); // just something to call it 
    } 

    public function init($id) 
    { 
     if($this->_loadUser ($id)) 
     { 
      $this->dispatcher->notify($this, 'user.loaded'); 
     } 
    } 

    public function save($id) 
    { 
     if(parent::save()) 
     { 
      $this->dispatcher->notify($this, 'user.saved'); 
     } 
    } 



} 

class Emailer 
{ 
    public function update ($caller,$msg) 
    { 
     switch ($msg) 
     { 
      case 'user.saved': 
     // send user an email 
     // re-cache some stuff 
     // other things that we might want to do, including more of these: 
     $this->dispatch->notify('user-saved-email-sent'); 
      break; 
     } 
    } 
} 

class Dispatcher 
{ 
    public function notify ($caller, $msg) { ...foreach attached do $obj->update($caller,$msg) ...} 
    public function attach ($obj) { ... } 
    public function detach ($obj) { ... } 
} 

を私はそれが可能だろうか強力見ることができます。しかし、私はどのようにこれらのリスナー/オブザーバーのセットアップとアタッチメントを簡単にするか分かりません。

おそらく私はそれらをすべて作成する工場を持っているはずですか?それはちょうどはいのように思えます、彼らは現在働いている方法から切り離されるでしょう、しかし、私は、それぞれのコントローラや方法で私が「つけなければならない」異なるオブジェクトを管理するように見えます。

おかげで、 ハンス

答えて

0

あなたの提案された構造のようなものでなければならないであろう。

$this->load->library('observer_factory', 'of'); // factory for creating observers 
// Observer_factory would have knowledge/access to different classes which relate 
// to the pattern. 
$ync = $this->of->getNotifier($some_variable)); 
$ync->attach($this->of->getObserver($some_other_variable)); 
$ync->attach($this->of->getObserver($some_final_variable)); 

$ync->someMethod(); // someMethod calls notify 

しかし、私はそれについてのだろうか。あなたは徐々にすべてを知っている工場クラスを持っています。これは、ローダーの機能を強奪し始めます。 Observer_factoryがまったく同じことを行うことでそれを処理できるようになると、なぜライブラリをロードするのですか?

あなたは、それが何をすべきかを知っていてうまく設計されているライブラリまたはモデルを使い、このクラス構造を追加する方がよいと思います。私はコストを上回る利益を見ません。

+0

ええ、私はこれらの出来事をすべて指揮できるアプリコアのアイディアが好きですが、現実にはそれは簡単ではないと思います。私は静的なメソッドのルートに行くことを考え、私はKohanaがそれを行う方法を見つけようとしました(しかし、まだ詳細を見る時間がなかった) – Hans

+0

Kohanaが3.0からそれを取り出したように見えます。うーん。彼らはそれがうまくいかなかったと思ったのでしょうか?人々はそれを静的クラスとしてサポートしていますが、もうコアモジュールではありません。 – Hans

関連する問題