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(观察者)的更多相关文章

  1. java: 观察者模式:Observable被观察者,Observer观察者

    java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...

  2. Java Observer 观察者

    http://www.cnblogs.com/jaward/p/3277619.html 1.API 被观察者 java.util.Observable; public class Observabl ...

  3. Java设计模式——Observer(观察者)模式

    在多个对象之间建立一对多的关系,以便当一个对象状态改变的时候.其它全部依赖于这个对象的对象都能得到通知,并被自己主动更新. 适用情况: 当一个抽象模型有两个方面,当中一个方面依赖于还有一方面. 将这二 ...

  4. 十七、 Observer 观察者设计模式

    设计: 代码清单: Observer public interface Observer { void update(NumberGenerator generator); } DigitObserv ...

  5. Laravel 利用 observer 类基于状态属性,对进行删除和修改的控制

    1 我们知道 Observer 类可以监听模型类的相关事件 1.1 creating, created, updating, updated, saving, saved, deleting, del ...

  6. Observer观察者设计模式

    Observer设计模式主要包括以下两种对象: (1)被观察对象:Subject,它往往包含其他对象感兴趣的东西,上面例子中热水器中就是Subject(被监视对象); (2)观察对象:Observer ...

  7. Observer 观察者

    意图 定义对象间的一种一对多的依赖关系 ,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 动机 一致性,松耦合 需要维护相关对象间的一致性.我们不希望为了维持一致性而使各类紧 ...

  8. Observer(观察者)设计模式[转]

    Observer设计模式中主要包括如下两类对象: Subject:监视对象,它往往包含着其他对象所感兴趣的内容.在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是tempratu ...

  9. C#委托与事件之观察者Observer设计模式

    前言    委托: 委托是一种在对象里保存方法引用的类型,同时也是一种类型安全的函数指针. 或委托可以看成一种表示函数的数据类型,类似函数指针. 事件是特殊的委托 观察者模式:两种角色:(1)Subj ...

随机推荐

  1. 云计算OpenStack共享组件---Memcache缓存系统(3)

    一.缓存系统 1.静态web页面: (1)在静态Web程序中,客户端使用Web浏览器(IE.FireFox等)经过网络(Network)连接到服务器上,使用HTTP协议发起一个请求(Request), ...

  2. IDEA 安装 zookeeper 可视化管理插件

    1. 安装 zookeeper 插件 打开 IDEA->Settings->Plugins,然后在 Marketplace 输入 "zookeeper" 如下: 插件安 ...

  3. 记一次MySQL(5.7版本)数据库的主从同步和备份

    我遇到的问题 我先后在BAT三大云服务器商购买了学生机,配置如下 百度云2核/4G 阿里云1核/2G 腾讯云1核/2G 我的解决方案 由于我不知道百度云的续费规则,导致买了2核/4G的服务器之后以为像 ...

  4. Boostrap bootstrap-table插件使用教程

    bootstrap table 简介及特性 简介 Bootstrap table 是国人开发的一款基于 Bootstrap 的 jQuery 表格插件,通过简单的设置,就可以拥有强大的单选.多选.排序 ...

  5. 一些固化了的语音识别模块demo, 手机重力传感器获取

    helloH5 这个软件里面有好多这个东东哦

  6. Mybatis 逆向工程使用(Day_17)

    有三个方法可以解决所有的问题:接受,改变,离开.不能接受那就改变,不能改变,那就离开. [何为逆向工程?] 众 所 周 知 ,正向工程就是通过JAVA类的设置来生成对应的数据库表. MyBatis逆向 ...

  7. 【Azure 事件中心】azure-spring-cloud-stream-binder-eventhubs客户端组件问题, 实践消息非顺序可达

    问题描述 查阅了Azure的官方文档( 将事件发送到特定分区: https://docs.azure.cn/zh-cn/event-hubs/event-hubs-availability-and-c ...

  8. 拉仇恨!webhook + 企业微信给同事做了个代码提交监听工具

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 最近接个任务,用webhook做了个代码提交监听功能,就是有人 ...

  9. 重新整理 .net core 实践篇—————配置系统之强类型配置[十]

    前言 前文中我们去获取value值的时候,都是通过configurationRoot 来获取的,如configurationRoot["key"],这种形式. 这种形式有一个不好的 ...

  10. Steam游戏《Northgard(北境之地)》修改器制作

    日期:2021.06.07 博客期:181 星期一 [温馨提示]: 我现在把资源先放到开头,不想研究学习的就直接取用.如果修改器失效了,你们可以在博客园本页直接评论,也可以给我发邮件告诉我,就是不要到 ...