Итак, я изучаю шаблоны проектирования и в настоящее время изучаю шаблон 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, чтобы добавлять, удалять и уведомлять в свой собственный абстрактный класс. Я также мог бы использовать SplSubject
а также SplObserver
что обеспечивает PHP. Что еще можно сделать здесь, чтобы сделать этот код лучше?
Но что я действительно хочу знать, так это то, где в Laravel используется шаблон Observer. Он должен использоваться где-то в рамках, и я могу извлечь из него уроки. Во-вторых, каковы практические применения для этого? Одна из вещей, о которой я мог подумать, это когда я занимаюсь кэшированием в laravel и когда модель обновляется, может потребоваться уведомление объектов кэша об изменении. Это хорошее практическое применение шаблона? Какие еще есть?
В моем проекте я использовал Observers, чтобы проверить, изменилась ли модель, и выдать событие, если изменения были сделаны.
Допустим, у меня есть Observer для моей модели пользователя, следовательно, UserObserver. Наблюдатель проверяет наличие изменений в моем пользователе. И если есть изменения.
У меня есть обработчик событий для сохранения транзакций.
Например, «Джон Доу обновил свое имя от Майка до Джона»
Где first name — это поле в моей пользовательской модели с именем first_name; Есть еще что-то для наблюдателей, и одно из них — мое заявление.
Других решений пока нет …