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 ...
随机推荐
- Linux进阶之综合练习
综合练习: 1.准备2台centos7系统的服务器,远程互相免密登录,以下所有题目过程中开启防火墙 2.给1号机和2号机使用光盘搭建本地yum源(永久生效) 3.给服务器1添加2块硬盘,1块1GB,1 ...
- Python小白的数学建模课-03.线性规划
线性规划是很多数模培训讲的第一个算法,算法很简单,思想很深刻. 要通过线性规划问题,理解如何学习数学建模.如何选择编程算法. 『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛 ...
- F5 BIG-IQ 8.0 发布 - 借助一个统一的管理平台,管理您的所有 BIG-IP 设备和服务
针对完整可见性和控制的 BIG-IQ 集中式管理 BIG-IP 设备和服务的端到端控制 高效管理(编排.可见性和合规性)依赖于跨本地和云部署中始终如一的应用服务和安全策略.利用独立统一的管理平台实现对 ...
- libevent中数据缓冲区buffer分析
很多时候为了应对数据IO的"慢"或者其他原因都需要使用数据缓冲区.对于数据缓冲,我们不陌生,但是对于如何实现这个缓冲区,相信很多时候大家都没有考虑过.今天就通过分析libevent ...
- 解决使用go get 下载模块下载超时的问题
解决使用go get 下载模块下载超时的问题 解决使用go get 下载模块下载超时的问题 使用go env可以看到,默认的GOPROXY的值是https://proxy.golang.org, ...
- mysql查看表的字段与含义
查看表的字段与含义 select column_name,column_comment from information_schema.`COLUMNS` where table_Schema='lo ...
- Numba实时变量分析
Numba实时变量分析 Numba使用引用计数进行垃圾回收,这是一种需要编译器配合的技术.Numba IR对必须插入decref的位置进行编码.这些位置通过实时变量分析确定.相应的源代码是https: ...
- 保姆级尚硅谷SpringCloud学习笔记(更新中)
目录 前言 正文内容 001_课程说明 002_零基础微服务架构理论入门 微服务优缺点[^1] SpringCloud与微服务的关系 SpringCloud技术栈 003_第二季Boot和Cloud版 ...
- 痞子衡嵌入式:嵌入式里串口(UART)自动波特率识别程序设计与实现
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式里串口(UART)自动波特率识别程序设计与实现. 串口(UART)是嵌入式里最基础最常用也最简单的一种通讯(数据传输)方式,可以说 ...
- MySQL 最佳实践 —— 高效插入数据
当你需要在 MySQL 数据库中批量插入数百万条数据时,你就会意识到,逐条发送 INSERT 语句并不是一个可行的方法. MySQL 文档中有些值得一读的 INSERT 优化技巧. 在这篇文章里,我将 ...