Create a Middleware in Laravel 10. using save log , when clien request to website

Hòa Nguyễn Coder

Published in Web Developer · Đã đăng vào tháng 5 12, 2024 9:08 PM

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
});

Nếu bạn thấy đem lại kiến thức bổ ích, hãy Click xem quảng cáo trên trang website của mình nhé! 🚀