Так что я изучаю шаблоны проектирования, и в настоящее время изучаю шаблон 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, и модель обновляется, возможно, потребуется уведомить об этом объекты кэша. Является ли это хорошим практическим применением шаблона? Что там есть?