Wenn wir uns täglich mit einigen Benutzerbetriebsereignissen befassen, müssen wir sie manchmal für spätere Referenzzwecke oder für Big-Data-Statistiken aufzeichnen.
Laravel ist sehr praktisch für die Handhabung von Modellereignissen: https://laravel-china.org/docs/laravel/5.5/eloquent#events
Laravels Modellereignisse haben zwei Möglichkeiten:
- settings
dispatchesEventsAttribute-Mapping-Ereignisklasse
- 使用观察器来注册事件,这里介绍第二种
- 新建模型
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
Verwenden Sie Beobachter, um Ereignisse zu registrieren
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="Detaillierte Erklärung der beiden Arten von Laravel-Modellereignissen">Migrationstabelle erstellen:</span><code>php artisan make:migration create_logs_table
php artisan migrate
🎜🎜🎜Erstellen Sie einen neuen Dienstanbieter, um alle Modellereignisse einheitlich zu registrieren Observers (Letzterer Name kann für Sie selbst anschaulicher sein)🎜php artisan make:provider ObserverLogServiceProvider
🎜🎜🎜to /config/app.php
providers
Array-Registrierung (wahrscheinlich wie im Bild gezeigt)🎜🎜![1627023658660847.png Detaillierte Erklärung der beiden Arten von Laravel-Modellereignissen](https://img.php.cn/upload/image/534/381/602/1627023658660847.png)
Observers
im Verzeichnis app
, um den Modellbeobachter zu speichern, und erstellen Sie einen Neue Basisklasse LogBaseServer
und grundlegende Attribute im Konstruktor erstellen (CLI liegt daran, dass bei der Ausführung über die Befehlszeile keine Benutzerausführung erfolgt)🎜🎜![1627023654440616.png Detaillierte Erklärung der beiden Arten von Laravel-Modellereignissen](https://img.php.cn/upload%20/image/414/636/%20440/1627023654440616.png)
LogBaseServer
( 🎜Benutzer🎜 Modell, Methodenname Entspricht den Ereignissen im Dokument)🎜🎜![1627023644839075 .png Detaillierte Erklärung der beiden Arten von Laravel-Modellereignissen](https://img.php.cn/upload/image/562/997/882/1627023644839075.png)
ObserverLogServiceProvider
und führen Sie ihn aus🎜🎜![1627023635638804.png Detaillierte Erklärung der beiden Arten von Laravel-Modellereignissen](https://img.php.cn/upload%20/image/559/684/442/1627023635638804.png%20)
![1627023629993300.png Detaillierte Erklärung der beiden Arten von Laravel-Modellereignissen](https://img.%20php.cn/upload/image/239/987/254/1627023629993300.png)
![1627023623212634.png Detaillierte Erklärung der beiden Arten von Laravel-Modellereignissen](https://img.php.cn/upload/image/776/858/509/%201627023623212634.png)
). anhängen
Methode)🎜Zu diesem Zeitpunkt müssen Sie eine neue Ereignisklasse erstellen, um sie zu simulieren (hier weisen wir Rollen grob Berechtigungen zu. Sprechen Sie darüber)🎜1 Binden Sie das Ereignis an das listen
-Attribut in EventServiceProvider
🎜🎜🎜![1627023612688787.png Detaillierte Erklärung der beiden Arten von Laravel-Modellereignissen](https://img.php.cn/upload/image/%20512/523/370/1627023612688787.png)
PermissionRoleEvent
ein, einer ist eine Rolle, der andere ist das von attach
oder abtrennen
🎜🎜🎜🎜🎜🎜🎜3. Der Ereignis-Listener PermissionRoleEventLog
erbt auch die Basisklasse LogBaseServer
, durchläuft hier entsprechend der übergebenen Array-ID und erstellt dann das Protokoll PermissionRoleEventLog
也继承基类LogBaseServer
,这里就是根据传入的数组id遍历,然后创建日志
4.之后应用事件
- 更优雅的处理登录注销事件
1.在EventServiceProvider
中的subscribe
4. Wenden Sie das Ereignis anschließend an
- Anmelde- und Abmeldeereignisse eleganter handhaben li>
subscribe
in EventServiceProvider
an die verarbeitete Klasse![1627023557746998.png Detaillierte Erklärung der beiden Arten von Laravel-Modellereignissen](https://img.php.cn/upload/image/352/219/720/1627023557746998.png)
2. Methoden von Event-Listening-Klassen