Chúng ta có thể tạo một Middleware in Laravel 10. Dùng để check các request của client khi vào website. Thật thú vị và bổ ích khi bạn làm điều đó, bạn có thể lưu lại log của người dùng và các thao tác của họ
# Tạo Middleware
hoacode@HOACODEs-MacBook-Pro laravel-10 % ./vendor/bin/sail php artisan make:middleware LogsMiddleware
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; use Illuminate\Support\Str; class LogsMiddleware { /** * Handle an incoming request. * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ public function handle(Request $request, Closure $next): Response { $requestId = (string) Str::uuid(); // data log $requestData = [ 'host' => $request->host(), 'request_id' => $requestId, 'token'=> $request->bearerToken(), 'url' => $request->fullUrl(), 'method' => $request->method(), 'ip' => $request->ip(), 'body' => json_encode($request->all()), 'contentTypes'=> $request->getAcceptableContentTypes(), 'referer' => $request->headers->get('referer')??'null' ]; //dd($requestData); // Web can save data logs here \App\Models\Log::create($requestData); $response = $next($request); $response->headers->set('Request-Id', $requestId); return $response; } }
# Tạo Models in Laravel
hoacode@HOACODEs-MacBook-Pro laravel-10 % ./vendor/bin/sail php artisan make:Log -m
Chạy lệnh trên ta sẽ được một tệp Log trong thư mục App\Models và -m sẽ tạo cho ta một file migration trong thư mục databases\migrations ta hãy mở lên và viết các thuộc tính cột cho nó thôi
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Log extends Model { use HasFactory; protected $fillable = [ 'request_id', 'url', 'method', 'ip', 'body', 'referer', ]; }
# Chỉnh sửa Mirgation
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { /** * Run the migrations. */ public function up(): void { Schema::create('logs', function (Blueprint $table) { $table->id(); $table->string('request_id'); $table->string('url'); $table->string('method'); $table->string('ip'); $table->string('body'); $table->string('referer'); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('logs'); } };
# Chạy lệnh Artisan
hoacode@HOACODEs-MacBook-Pro laravel-10 % ./vendor/bin/sail php artisan migrate
# Khai báo lớp Middleware
Mở App\Http\Kernel.php
protected $middlewareAliases = [ .... 'request-log' => \App\Http\Middleware\LogsMiddleware::class ]
# Dùng Middleware
Ta có thể dụng nó bắt cứ đâu chúng ta muốn, Ví dụ mình dùng nó trong file api.php
Route::controller(App\Http\Controllers\ProductRedisController::class)->prefix('redis')->name('redis.products')->middleware('request-log')->group(function () { Route::get('/products', 'index');// redis.products.index Route::get('/products/{id}', 'show'); //redis.products.show Route::get('/products/create', 'create'); //redis.products.create Route::post('/products', 'store'); //redis.products.store Route::get('/products/edit/{id}', 'edit'); //redis.products.edit Route::put('/products/{id}', 'update'); //redis.products.update Route::delete('/products/{id}', 'destroy'); //redis.products.destroy });