2016-09-01 2 views
0

Так что я изучаю шаблоны проектирования, и в настоящее время изучаю шаблон Observer.Как использовать шаблон Observer в laravel?

Для ее реализации на сырьевой основе, я сделал что-то вроде этого:

<?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(); 

Так я вижу, что наблюдатели становятся обновлены. Это правильный способ реализации шаблона наблюдателя? Думаю, я мог бы абстрагировать функциональность в теме, чтобы добавлять, удалять и уведомлять в свой собственный абстрактный класс. Я также мог бы использовать SplSubject и SplObserver, которые предоставляет PHP. Что еще можно сделать здесь, чтобы сделать этот код лучше?

Но я действительно хочу знать, где находится шаблон наблюдателя, используемый в Laravel. Он должен использоваться где-то в рамках, и я могу учиться на нем. Во-вторых, каковы практические применения этого? Одна из вещей, о которых я мог подумать, - это когда я делаю кеширование в laravel, и модель обновляется, возможно, потребуется уведомить об этом объекты кэша. Является ли это хорошим практическим применением шаблона? Что там есть?

ответ

0

В моем проекте я использовал Наблюдателей, чтобы проверить, изменилась ли модель, и выбросить событие, если были сделаны изменения.

Скажем, у меня есть наблюдатель для моей модели пользователя, следовательно, UserObserver. То, что делает наблюдатель, это проверка изменений в моем пользователе. И если есть изменения.

У меня есть обработчик событий для сохранения транзакций.

например «John Doe обновил свое имя от Майка Джона»

Где первое имя поля в моей модели пользователя по имени first_name; Наблюдателей больше, и одно - мое приложение.

Смежные вопросы