• 技术文章 >php框架 >Laravel

    Laravel如何使用Observer实现日志管理模块

    藏色散人藏色散人2021-07-12 08:55:32转载150

    Laravel使用Observer(观察者)实现日志管理模块

    写在前面:
    这里实现日志管理写了两篇,第一篇是简单的模型增删改监听并记录日志。第二篇主要介绍的是通过导入文件进行批量数据处理无法很好的被监听处理到,这一部分的数据处理逻辑如何被记录下来。详细请看Laravel日志管理记录导入文件后的数据变化。

    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模型的新增、更新和删除的操作。

    <?phpnamespace 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视频教程

    以上就是Laravel如何使用Observer实现日志管理模块的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:csdn,如有侵犯,请联系admin@php.cn删除
    专题推荐:Laravel Observer
    上一篇:一文介绍Laravel Ignition的一切 下一篇:分享一个好用的Laravel 扩展(laravel-hprose)
    第16期线上培训班

    相关文章推荐

    • 分享Laravel7消息通知日期序列化解决方案• 分享laravel超好用程序提示工具Laravel IDE Helper• 简析Laravel中的Many-To-Many• 解决方案:处理laravel返回值响应

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网