【问题标题】:How to practically use the Observer pattern in laravel?如何在 laravel 中实际使用观察者模式?
【发布时间】:2016-09-01 09:01:49
【问题描述】:

所以我正在学习设计模式,目前正在研究观察者模式。

为了在原始基础上实现它,我做了这样的事情:

<?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 中使用的观察者模式在哪里。它必须在框架中的某个地方使用,我可以从中学习。其次,它的实际应用是什么?我能想到的一件事是,当我在 laravel 中进行缓存并且模型更新时,它可能需要通知缓存对象进行更改。这是该模式的一个很好的实际应用吗?还有哪些?

【问题讨论】:

    标签: php laravel observer-pattern


    【解决方案1】:

    在我的项目中,我使用 Observers 来检查 A 模型是否已更改,如果已进行更改则抛出事件。

    假设我的用户模型有观察者,因此有 UserObserver。观察者所做的是检查我的用户的变化。如果有变化。

    我有一个事件处理程序来保存事务。

    例如“John Doe 已将他的名字从 Mike 更新为 John”

    名字是我的用户模型中名为 first_name 的字段;观察者还有更多,其中一个是我的应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多