Laravel使用Observer(观察者)
1、创建observer文件,我这里是要记录仓库库存模块的操作日志,所以执行下面的语句,会在app/Observers下面创建WarehouseInventoryObserver文件。
php artisan make:observer WarehouseInventoryObserver --model=WarehouseInventory
由于模型都是放在app/Models下面,所以要指定路径。
php artisan make:observer WarehouseInventoryObserver --model=Models/WarehouseInventory
在App\Providers\AppServiceProvider下面开启observer
public function boot()
    {
        WarehouseInventory::observe(WarehouseInventoryObserver::class);
    }
2、监听该模块下的增删改操作,这里使用Repository当然也可以直接使用model。created、updated、deleted分别监听WarehouseInventory模型的新增、更新和删除的操作。
<?php
namespace App\Observers;
use App\Models\Warehouse;
use App\Models\WarehouseInventory;
use App\Repositories\ActionLogRepository;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Auth;
class WarehouseInventoryObserver
{
    protected $user_id;
    protected $warehouse;
    protected $actionLogRepository;
    public function __construct(
        Warehouse $warehouse,
        ActionLogRepository $actionLogRepository
    )
    {
        $this->user_id = Auth::user() ? Auth::user()->id : null;
        $this->warehouse = $warehouse->pluck('name', 'id');
        $this->actionLogRepository = $actionLogRepository;
    }
    //创建
    public function created(WarehouseInventory $warehouseInventory)
    {
        if (!empty($this->user_id)) {
            $attributes = $warehouseInventory->getAttributes();
            $attributes = Arr::only($attributes, ['warehouse_id', 'seller_sku', 'quantity', 'box']);
            $warehouse = $this->warehouse->get($attributes['warehouse_id']);
            //拼接数据
            $data = [
                'module' => 'warehouse_inventory',
                'user_id' => $this->user_id,
                'type' => 'create',
                'content' => [
                    'warehouse' => $warehouse,
                    'seller_sku' => $attributes['seller_sku'],
                    'original_quantity' => 0,
                    'current_quantity' => $attributes['quantity'],
                    'box' => $attributes['box']
                ]
            ];
            $this->actionLogRepository->makeModel()->create($data);
        }
    }
    //更新
    public function updated(WarehouseInventory $warehouseInventory)
    {
        if (!empty($this->user_id)) {
            $original = $warehouseInventory->getOriginal();
            $dirty = $warehouseInventory->getDirty();
            $dirty = Arr::except($dirty, ['remark', 'updated_at']);
            if (count($dirty)) {
                if (Arr::has($dirty, 'warehouse_id')) {
                    $warehouse = $this->warehouse->get($dirty['warehouse_id']);
                } else {
                    $warehouse = $this->warehouse->get($original['warehouse_id']);
                }
                //拼接数据
                $data = [
                    'module' => 'warehouse_inventory',
                    'user_id' => $this->user_id,
                    'type' => 'update',
                    'content' => [
                        'warehouse' => $warehouse,
                        'seller_sku' => $original['seller_sku'],
                        'original_quantity' => $original['quantity'],
                        'current_quantity' => $dirty['quantity'],
                        'box' => (Arr::has($dirty, 'box')) ? $dirty['box'] : $original['box']
                    ]
                ];
                $this->actionLogRepository->makeModel()->create($data);
            }
        }
    }
    //删除
    public function deleted(WarehouseInventory $warehouseInventory)
    {
        if (!empty($this->user_id)) {
            $original = $warehouseInventory->getOriginal();
            $warehouse = $this->warehouse->get($original['warehouse_id']);
            //拼接数据
            $data = [
                'module' => 'warehouse_inventory',
                'user_id' => $this->user_id,
                'type' => 'delete',
                'content' => [
                    'warehouse' => $warehouse,
                    'seller_sku' => $original['seller_sku'],
                    'original_quantity' => $original['quantity'],
                    'current_quantity' => 0,
                    'box' => $original['box']
                ]
            ];
            $this->actionLogRepository->makeModel()->create($data);
        }
    }
}
3、数据库


Laravel使用Observer(观察者)的更多相关文章
- java: 观察者模式:Observable被观察者,Observer观察者
		
java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...
 - Java Observer 观察者
		
http://www.cnblogs.com/jaward/p/3277619.html 1.API 被观察者 java.util.Observable; public class Observabl ...
 - Java设计模式——Observer(观察者)模式
		
在多个对象之间建立一对多的关系,以便当一个对象状态改变的时候.其它全部依赖于这个对象的对象都能得到通知,并被自己主动更新. 适用情况: 当一个抽象模型有两个方面,当中一个方面依赖于还有一方面. 将这二 ...
 - 十七、 Observer 观察者设计模式
		
设计: 代码清单: Observer public interface Observer { void update(NumberGenerator generator); } DigitObserv ...
 - Laravel 利用 observer 类基于状态属性,对进行删除和修改的控制
		
1 我们知道 Observer 类可以监听模型类的相关事件 1.1 creating, created, updating, updated, saving, saved, deleting, del ...
 - Observer观察者设计模式
		
Observer设计模式主要包括以下两种对象: (1)被观察对象:Subject,它往往包含其他对象感兴趣的东西,上面例子中热水器中就是Subject(被监视对象); (2)观察对象:Observer ...
 - Observer 观察者
		
意图 定义对象间的一种一对多的依赖关系 ,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 动机 一致性,松耦合 需要维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧 ...
 - Observer(观察者)设计模式[转]
		
Observer设计模式中主要包括如下两类对象: Subject:监视对象,它往往包含着其他对象所感兴趣的内容.在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是tempratu ...
 - C#委托与事件之观察者Observer设计模式
		
前言 委托: 委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针. 或委托可以看成一种表示函数的数据类型,类似函数指针. 事件是特殊的委托 观察者模式:两种角色:(1)Subj ...
 
随机推荐
- DOCKER学习_016:Docker镜像仓库和HARBOR的简单安装和管理
			
一 镜像仓库介绍 1.1 简介 镜像仓库用于存放 Docker镜像 Docker registry提供镜像仓库服务 一个 Docker registry可以包含多个镜像仓库 仓库分为公共镜像仓库与私有 ...
 - java 实现简单的单点登录
			
https://my.oschina.net/leamon/blog/266711 https://serviceturbo-cloud-cn.huawei.com/serviceturbocloud ...
 - 【Azure 应用服务】由 Azure Functions runtime is unreachable 的错误消息推导出 ASYNC(异步)和 SYNC(同步)混用而引起ThreadPool耗尽问题
			
问题描述 在Azure Function Portal上显示: Azure Functions runtime is unreachable,引起的结果是Function App目前不工作,但是此前一 ...
 - Go基础结构与类型04---基本数据类型
			
package main import "fmt" func main() { //整型 var a byte = 123 var b rune = 123 var c int = ...
 - 运用iGuard防御ADS权限维持
			
权限维持是一门庞大的学问,当攻击者在入侵服务器获得主机权限后,往往会想尽办法隐藏其入侵途径以维持权限.权限维持的一般手段包括构造文件包含漏洞.构造远程任意代码执行漏洞.构造SQL注入点.利用系统自启动 ...
 - postman之将获取响应数据-创建环境变量,用于不同的接口调用
			
应用场景: token的获取,用于不同接口的取值 在test中进行如下设置: var jd = pm.response.json(); var access_token = jd.access_tok ...
 - Python集合:set
			
集合 集合的描述 set是一个无序不重复的序列,可以用{}或者 set() 函数创建集合,它存放不可变类型(如字符串.数字.元组)数据. 注意:创建一个空集合必须使用set()方法,因为{}是用来生成 ...
 - Centos Yum 安装 Mysql 5.7
			
Centos 6 / 7 官方源安装Mysql 5.7 1 检查当前系统是否有旧版本 # rpm -qa | grep mysqlmysql-libs-5.1.71-1.el6.x86_64 # r ...
 - Servlet--核心内容汇总
			
Servlet汇总 因为看公司代码,有个cookie+jwt.Token登录验证接口,于是回顾下servlet.cookie.session.前后端分离restful.jwt.token相关内容.虽然 ...
 - tree (一本通练习||清华集训互测)
			
tree 内存限制:512 MiB 时间限制:3000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有nee ...