일상적으로 일부 사용자 작업 이벤트를 처리할 때 나중에 참조하거나 빅데이터 통계를 위해 기록해야 하는 경우가 있습니다.
Laravel은 모델 이벤트를 처리하는 데 매우 편리합니다: https://laravel-china.org/docs/laravel/5.5/eloquent#events
Laravel의 모델 이벤트에는 두 가지 방법이 있습니다.
- settings
dispatchesEvents속성 매핑 이벤트 클래스
- 使用观察器来注册事件,这里介绍第二种
- 新建模型
dispatchesEvents
属性映射事件类php artisan make:model Log
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Log extends Model { protected $fillable = ['user_name', 'user_id', 'url', 'event', 'method', 'table', 'description']; }
- 创建迁移表:
php artisan make:migration create_logs_table
- 表的结构大概是这样,可按需设计
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateLogsTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('logs', function (Blueprint $table) { $table->engine = 'InnoDB'; $table->increments('id'); $table->string('user_id')->comment('操作人的ID'); $table->string('user_name')->comment('操作人的名字,方便直接查阅'); $table->string('url')->comment('当前操作的URL'); $table->string('method')->comment('当前操作的请求方法'); $table->string('event')->comment('当前操作的事件,create,update,delete'); $table->string('table')->comment('操作的表'); $table->string('description')->default(''); $table->timestamps(); }); DB::statement("ALTER TABLE `logs` comment '操作日志表'"); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('logs'); } }
- 运行迁移生成表
php artisan migrate
- 新建一个服务提供者统一注册所有的模型事件观察器(后面的名字可以自己起得形象一点)
php artisan make:provider ObserverLogServiceProvider
- 到
/config/app.php
中的providers
数组注册(大概如图中)
- 在
app
目录下新建文件夹Observers
存放模型观察器,并新建基类LogBaseServer
并在构造函数构建基本属性(CLI是因为在命令行执行时不存在用户执行)
- 新建一个观察器继承基类
LogBaseServer
(User模型,方法的名字要对应文档中的事件)
- 到新建的服务提供者
ObserverLogServiceProvider
中运行
- 为需要的模型注册事件(我这挺多的,之后大概长这样)
- 然后我们触发一些事件(增删改,表的数据就有了)
- 多对多的关联插入不会出触发模型(比如
attach
方法) - 这时候就需要自己新建事件类来模拟(这里拿分配权限给角色粗略说一下)
1.在EventServiceProvider
中的listen
属性绑定好事件
2.事件PermissionRoleEvent
中的注入两个参数,一个是角色,另一个是attach
或者detach
관찰자를 사용하여 이벤트를 등록합니다. 두 번째 방법은 다음과 같습니다.
php artisan make: model Log code><span class="img-wrap">rrreee<img class="lazy" referrerpolicy="no-referrer" src="/img/remote/1460000013815118?w=1345&h=665" alt="" title=""><img src="https://img.php.cn/upload/image/492/109/627/1627023592973459.png" title="1627023592973459.png" alt="Laravel 모델 이벤트의 두 가지 방법에 대한 자세한 설명">마이그레이션 테이블 생성:</span><code>php artisan make:migration create_logs_table
php artisan migration
🎜🎜🎜모든 모델 이벤트를 균일하게 등록하기 위해 새로운 서비스 공급자 생성 관찰자(후자의 이름은 여러분이 더 생생할 수 있습니다)🎜php artisan make:provider ObserverLogServiceProvider
🎜🎜🎜to /config/app.php
providers
배열 등록(아마도 그림에 표시됨)🎜🎜🎜🎜🎜🎜 app
디렉터리에 모델 관찰자를 저장할 새 폴더 Observers
를 만들고, 새로운 기본 클래스 LogBaseServer
및 생성자에 기본 속성 구축(CLI는 명령줄에서 실행할 때 사용자 실행이 없기 때문입니다)🎜🎜🎜🎜🎜🎜기본 클래스를 상속할 새 관찰자를 만듭니다. 코드>LogBaseServer ( 🎜User🎜 모델, 메소드 이름 문서의 이벤트에 대응)🎜🎜🎜🎜🎜🎜새로 생성된 서비스 공급자 ObserverLogServiceProvider
로 이동하여 실행🎜🎜🎜🎜🎜🎜필요한 모델에 대한 이벤트를 등록합니다. 그 중 아마도 그럴 것이다. 앞으로는 이렇게 될 것입니다)🎜🎜🎜🎜🎜🎜 그런 다음 몇 가지 이벤트(추가, 삭제, 수정, 테이블 데이터가 있습니다)를 트리거합니다.🎜🎜🎜 🎜🎜🎜🎜다대다 연관 삽입은 트리거 모델을 생성하지 않습니다(예: 첨부 방법)🎜이번에는 이를 시뮬레이션하기 위해 새 이벤트 클래스를 생성해야 합니다. (여기서는 대략적으로 역할에 권한을 할당합니다.) 이에 대해 이야기합니다.)🎜1. EventServiceProvider
🎜🎜🎜🎜🎜🎜2. PermissionRoleEvent
이벤트에 두 개의 매개변수를 삽입합니다. 하나는 role이고 다른 하나는 attach
또는 분리
🎜🎜🎜🎜🎜🎜🎜3. 이벤트 리스너 PermissionRoleEventLog
도 기본 클래스 LogBaseServer
를 상속합니다. 여기서는 전달된 배열 ID에 따라 순회한 다음 로그 PermissionRoleEventLog
也继承基类LogBaseServer
,这里就是根据传入的数组id遍历,然后创建日志
4.之后应用事件
- 更优雅的处理登录注销事件
1.在EventServiceProvider
中的subscribe
4. 이벤트는 추후 적용
EventServiceProvider
의 subscribe
속성을 처리된 클래스2에 바인딩합니다.