2016-09-01 4 views
0

デザインパターンについて学んでいます。現在、オブザーバーパターンを研究しています。生基づいて、それを実装するためにlaravelでObserverパターンを実際に使用する方法は?

は、私はこのような何かをした:

<?php 

class Subject 
{ 
    private $foo; 
    private $bar; 

    private $observers = []; 

    public function addObserver(Observer $o) 
    { 
     $this->observers[] = $o; 
    } 

    public function removeObserver(Observer $o) 
    { 
     if(($key = array_search($o, $this->observers, $TRUE)) !== FALSE) { 
      unset($this->observers[$key]); 
     } 
    } 

    public function notify() 
    { 
     foreach ($this->observers as $observer) { 
      $observer->update($this->foo, $this->bar); 
     } 
    } 

    public function setFoo($foo) 
    { 
     $this->foo = $foo; 
    } 

    public function setBar($bar) 
    { 
     $this->bar = $bar; 
    } 
} 

interface Observer{ 
    function update($foo, $bar); 
} 

class Observer1 implements Observer 
{ 
    private $foo; 
    private $bar; 

    public function update($foo, $bar){ 
     $this->foo = $foo; 
     $this->bar = $bar; 
    } 

    public function display() 
    { 
     echo "Observer1 : Foo -> " . $this->foo . " Bar -> " . $this->bar . "\n"; 
    } 
} 

class Observer2 implements Observer 
{ 
    private $foo; 
    private $bar; 

    public function update($foo, $bar){ 
     $this->foo = $foo; 
     $this->bar = $bar; 
    } 

    public function display() 
    { 
     echo "Observer2 : Foo -> " . $this->foo . " Bar -> " . $this->bar . "\n"; 
    } 
} 

$subject = new Subject; 


$observer1 = new Observer1; 
$observer2 = new Observer2; 

$subject->addObserver($observer1); 
$subject->addObserver($observer2); 

$subject->setFoo(5); 
$subject->setBar(10); 
$subject->notify(); 

$observer1->display(); 
$observer2->display(); 

$subject->setFoo(20); 
$subject->setBar(40); 
$subject->notify(); 

$observer1->display(); 
$observer2->display(); 

だから私はオブザーバーが更新取得していることがわかります。これはオブザーバパターンを実装する正しい方法ですか?私は、自分の抽象クラスに追加、削除、通知するためにSubjectの機能を抽象化することができたと思います。 PHPが提供するSplSubjectSplObserverも利用できます。このコードをより良くするためにここで何ができるのでしょうか?

私が本当に知りたいことは、Laravelで使用されているオブザーバーパターンがどこにあるかです。それはフレームワークのどこかで使用されている必要があり、私はそれから学ぶことができます。第二に、これのための実用的なアプリケーションは何ですか?私が考えることのできるものの1つは、laravelでキャッシュを実行しているときにモデルが更新されたときに、変更するキャッシュオブジェクトに通知する必要がある場合があります。パターンの実用的な応用ですか?他には何がありますか?

答えて

0

私のプロジェクトでは、Observersを使用して、モデルが変更されたかどうかを確認し、変更があった場合はイベントをスローしました。

私のObserverが私のUser Model、つまりUserObserverを持っているとしましょう。オブザーバーが行うことは、ユーザーの変更をチェックすることです。そして、もし変化があれば。

私はトランザクションを保存するイベントハンドラを持っています。

例えば最初の名前は、first_nameの名前の私のユーザーモデルフィールドである

を「ジョン・ドウは、マイクからのジョンに彼の最初の名前を更新しました」。オブザーバーにはもう1つ、私のアプリケーションは1つです。

関連する問題