In daily processing of user operation events, we sometimes need to record them for future reference or big data statistics.
Laravel
handles model events conveniently: https://laravel-china.org/docs/laravel/5.5/eloquent#events
There are two approaches to Laravel model events:
- Set the
dispatchesEvents
property to map event classes - Use observers to register events (this article focuses on the second approach)
Implementation Steps
- Create Model
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'];
}
-
Create Migration Table
php artisan make:migration create_logs_table
Table structure example (customize as needed):
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateLogsTable extends Migration
{
public function up()
{
Schema::create('logs', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->string('user_id')->comment('Operator\'s ID');
$table->string('user_name')->comment('Operator\'s name for quick reference');
$table->string('url')->comment('Current operation URL');
$table->string('method')->comment('HTTP method of current operation');
$table->string('event')->comment('Event type: create, update, delete');
$table->string('table')->comment('Affected database table');
$table->string('description')->default('');
$table->timestamps();
});
DB::statement("ALTER TABLE `logs` comment 'Operation Log Table'");
}
public function down()
{
Schema::dropIfExists('logs');
}
}
-
Run Migration
php artisan migrate
-
Create Service Provider for Observers
php artisan make:provider ObserverLogServiceProvider
-
Create Base Observer Class
CreateLogBaseServer
underapp/Observers
:// Base class handles CLI execution scenarios
-
Implement Model Observer
Create observer forUser
model:
User Observer -
Register Observers
InObserverLogServiceProvider
:
Observer Registration -
Bind Events to Models
Example model event registration:
Model Event Binding -
Trigger Events
Test CRUD operations to populate logs:
Event Results
Handling Many-to-Many Relationships
- Note: Methods like
attach()
/detach()
don’t trigger model events.
-
Bind Custom Event
InEventServiceProvider
:protected $listen = [ 'App\Events\PermissionRoleEvent' => [ 'App\Listeners\PermissionRoleEventLog', ], ];
-
Create Event Class
PermissionRoleEvent
with parameters:
PermissionRoleEvent -
Implement Listener
PermissionRoleEventLog
inheritsLogBaseServer
:
Listener Implementation
Handling Login/Logout Events Elegantly
-
Bind Subscriber
InEventServiceProvider
:protected $subscribe = [ 'App\Listeners\UserEventLog', ];
-
Implement Event Methods
InUserEventLog
:
Login/Logout Handlers