Laravel事件之观察者模式

观察者模式

Laravel的事件提供了一个简单的观察者实现,能够订阅和监听应用中发生的各种事件。

既然用到观察者实现,那我们先来说下什么是观察者

观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

场景:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新的逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码

观察者模式实现了低耦合,非侵入式的通知与更新机制

具体代码实现



/**
 * 观察者接口类
 * Interface Observer
 */
interface Observer
{
    public function update($event_info = null);
}

/**
 * 观察者1
 */
class Observer1 implements Observer
{
    public function update($event_info = null)
    {
        echo "观察者1 收到执行通知 执行完毕!\n";
    }
}

/**
 * 观察者1
 */
class Observer2 implements Observer
{
    public function update($event_info = null)
    {
        echo "观察者2 收到执行通知 执行完毕!\n";
    }
}



/**
 * 事件
 * Class Event
 */
class Event
{
    //用于观察者注册的数组
    protected $this->observers = [];

    //增加观察者
    public function add(Observer $observer)
    {
        $this->observers[] = $observer;
    }

    //事件通知
    public function notify()
    {
        foreach ($this->observers as $observer) {
            $observer->update();
        }
    }

    /**
     * 触发事件
     */
    public function trigger()
    {
        //通知观察者
        $this->notify();
    }
}

// 服务类 去实现事件的创建和触发,不关心具体多少调用方需要监听
class DemoService
{
    public function demo()
    {
        //创建一个事件
        $event = new Event();

        ... 

        //执行事件 通知旁观者
        $event->trigger();
    }
}

// 调用方,调用方仅仅需要知道服务类创建了哪些事件
class DoService
{
    public function do()
    {
        //为事件增加旁观者
        $event->add(new Observer1());
        $event->add(new Observer2());
    }
}



Laravel中使用事件

在laravel中事件使用特别简单,我们可以通过


php artisan make:event // 创建事件
php artisan make:listener // 创建事件监听者,可以为多个。 

laravel 事件类保存在 app/Events 目录中,而这些事件的的监听器则被保存在 app/Listeners 目录下。


// 在程序需要触发事件的地方通过event()触发事件,比如注入给用户发送站内信的事件,发送邮件的事件

event(new SendMailEvent());

示例代码下载链接

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
cxp1539
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
贡献者:2
讨论数量: 0
发起讨论 只看当前版本


暂无话题~