Laravel - มิดเดิลแวร์

มิดเดิลแวร์ทำหน้าที่เป็นสะพานเชื่อมระหว่างคำขอและการตอบกลับ เป็นกลไกการกรองประเภทหนึ่ง บทนี้อธิบายกลไกมิดเดิลแวร์ใน Laravel

Laravel มีมิดเดิลแวร์ที่ใช้ตรวจสอบว่าผู้ใช้แอปพลิเคชันได้รับการรับรองความถูกต้องหรือไม่ หากผู้ใช้ได้รับการพิสูจน์ตัวตนผู้ใช้จะเปลี่ยนเส้นทางไปยังโฮมเพจมิฉะนั้นจะเปลี่ยนเส้นทางไปยังหน้าล็อกอิน

สามารถสร้างมิดเดิลแวร์ได้โดยดำเนินการคำสั่งต่อไปนี้ -

php artisan make:middleware <middleware-name>

แทนที่ <middleware-name>ด้วยชื่อมิดเดิลแวร์ของคุณ ตัวกลางที่คุณสร้างสามารถดูได้ที่app/Http/Middleware ไดเรกทอรี

ตัวอย่าง

สังเกตตัวอย่างต่อไปนี้เพื่อทำความเข้าใจกลไกตัวกลาง -

Step 1- ให้เราสร้าง AgeMiddleware ในการสร้างสิ่งนั้นเราต้องดำเนินการคำสั่งต่อไปนี้ -

php artisan make:middleware AgeMiddleware

Step 2 - หลังจากดำเนินการคำสั่งสำเร็จคุณจะได้รับผลลัพธ์ต่อไปนี้ -

Step 3 - AgeMiddleware จะถูกสร้างขึ้นที่ app/Http/Middleware. ไฟล์ที่สร้างขึ้นใหม่จะมีรหัสต่อไปนี้ที่สร้างไว้สำหรับคุณแล้ว

<?php

namespace App\Http\Middleware;
use Closure;

class AgeMiddleware {
   public function handle($request, Closure $next) {
      return $next($request);
   }
}

การลงทะเบียนมิดเดิลแวร์

เราจำเป็นต้องลงทะเบียนทุกตัวกลางก่อนใช้งาน มี Middleware สองประเภทใน Laravel

  • มิดเดิลแวร์ระดับโลก
  • เส้นทางมิดเดิลแวร์

Global Middleware จะทำงานตามคำขอ HTTP ทุกรายการของแอปพลิเคชันในขณะที่ไฟล์ Route Middlewareจะถูกกำหนดให้กับเส้นทางเฉพาะ สามารถลงทะเบียนมิดเดิลแวร์ได้ที่app/Http/Kernel.php. ไฟล์นี้มีคุณสมบัติสองอย่าง $middleware และ $routeMiddleware. $middleware ใช้เพื่อลงทะเบียน Global Middleware และ $routeMiddleware คุณสมบัติถูกใช้เพื่อลงทะเบียนมิดเดิลแวร์เฉพาะเส้นทาง

ในการลงทะเบียนมิดเดิลแวร์ส่วนกลางให้แสดงรายการคลาสที่ส่วนท้ายของคุณสมบัติ $ มิดเดิลแวร์

protected $middleware = [
   \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
   \App\Http\Middleware\EncryptCookies::class,
   \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
   \Illuminate\Session\Middleware\StartSession::class,
   \Illuminate\View\Middleware\ShareErrorsFromSession::class,
   \App\Http\Middleware\VerifyCsrfToken::class,
];

ในการลงทะเบียนมิดเดิลแวร์เฉพาะเส้นทางให้เพิ่มคีย์และค่าให้กับคุณสมบัติ $ routeMiddleware

protected $routeMiddleware = [
   'auth' => \App\Http\Middleware\Authenticate::class,
   'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
   'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
];

ตัวอย่าง

เราได้สร้าง AgeMiddlewareในตัวอย่างก่อนหน้านี้ ตอนนี้เราสามารถลงทะเบียนได้ในคุณสมบัติมิดเดิลแวร์กำหนดเส้นทาง รหัสสำหรับการลงทะเบียนนั้นแสดงอยู่ด้านล่าง

ต่อไปนี้เป็นรหัสสำหรับ app/Http/Kernel.php -

<?php

namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel {
   protected $middleware = [
      \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
      \App\Http\Middleware\EncryptCookies::class,
      \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
      \Illuminate\Session\Middleware\StartSession::class,
      \Illuminate\View\Middleware\ShareErrorsFromSession::class,
      \App\Http\Middleware\VerifyCsrfToken::class,
   ];
  
   protected $routeMiddleware = [
      'auth' => \App\Http\Middleware\Authenticate::class,
      'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
      'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
      'Age' => \App\Http\Middleware\AgeMiddleware::class,
   ];
}

พารามิเตอร์มิดเดิลแวร์

เรายังสามารถส่งผ่านพารามิเตอร์ด้วยมิดเดิลแวร์ ตัวอย่างเช่นหากแอปพลิเคชันของคุณมีบทบาทที่แตกต่างกันเช่นผู้ใช้ผู้ดูแลระบบผู้ดูแลระบบขั้นสูงเป็นต้นและคุณต้องการตรวจสอบการดำเนินการตามบทบาทคุณสามารถทำได้โดยการส่งผ่านพารามิเตอร์ด้วยมิดเดิลแวร์ มิดเดิลแวร์ที่เราสร้างมีฟังก์ชันต่อไปนี้และเราสามารถส่งผ่านอาร์กิวเมนต์ที่กำหนดเองของเราได้หลังจากไฟล์$next การโต้เถียง.

public function handle($request, Closure $next) {
   return $next($request);
}

ตัวอย่าง

Step 1 - สร้าง RoleMiddleware โดยดำเนินการคำสั่งต่อไปนี้ -

php artisan make:middleware RoleMiddleware

Step 2 - หลังจากดำเนินการสำเร็จคุณจะได้รับผลลัพธ์ต่อไปนี้ -

Step 3 - เพิ่มรหัสต่อไปนี้ในวิธีจัดการของ RoleMiddlewareat ที่สร้างขึ้นใหม่ app/Http/Middleware/RoleMiddleware.php.

<?php

namespace App\Http\Middleware;
use Closure;

class RoleMiddleware {
   public function handle($request, Closure $next, $role) {
      echo "Role: ".$role;
      return $next($request);
   }
}

Step 4 - ลงทะเบียน RoleMiddleware ใน app\Http\Kernel.phpไฟล์. เพิ่มบรรทัดที่ไฮไลต์ด้วยสีเทาในไฟล์นั้นเพื่อลงทะเบียน RoleMiddleware

Step 5 - ดำเนินการคำสั่งต่อไปนี้เพื่อสร้าง TestController -

php artisan make:controller TestController --plain

Step 6 - หลังจากดำเนินการตามขั้นตอนข้างต้นสำเร็จคุณจะได้รับผลลัพธ์ต่อไปนี้ -

Step 7 - คัดลอกโค้ดบรรทัดต่อไปนี้ไปที่ app/Http/TestController.php ไฟล์.

app/Http/TestController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class TestController extends Controller {
   public function index() {
      echo "<br>Test Controller.";
   }
}

Step 8 - เพิ่มบรรทัดของรหัสต่อไปนี้ใน app/Http/routes.php ไฟล์.

app/Http/routes.php

Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);

Step 9 - ไปที่ URL ต่อไปนี้เพื่อทดสอบ Middleware ด้วยพารามิเตอร์

http://localhost:8000/role

Step 10 - ผลลัพธ์จะปรากฏดังที่แสดงในภาพต่อไปนี้

มิดเดิลแวร์ที่ยุติได้

มิดเดิลแวร์ที่บอกเลิกได้จะทำงานบางอย่างหลังจากที่ส่งการตอบกลับไปยังเบราว์เซอร์ ซึ่งสามารถทำได้โดยการสร้างมิดเดิลแวร์ด้วยterminateวิธีการในมิดเดิลแวร์ มิดเดิลแวร์ที่ยกเลิกได้ควรลงทะเบียนกับมิดเดิลแวร์ระดับโลก เมธอด terminate จะได้รับสองอาร์กิวเมนต์$request และ $response. สามารถสร้างเมธอด Terminate ได้ดังแสดงในโค้ดต่อไปนี้

ตัวอย่าง

Step 1 - สร้าง TerminateMiddleware โดยดำเนินการคำสั่งด้านล่าง

php artisan make:middleware TerminateMiddleware

Step 2 - ขั้นตอนข้างต้นจะให้ผลลัพธ์ดังต่อไปนี้ -

Step 3 - คัดลอกรหัสต่อไปนี้ในสิ่งที่สร้างขึ้นใหม่ TerminateMiddleware ที่ app/Http/Middleware/TerminateMiddleware.php.

<?php

namespace App\Http\Middleware;
use Closure;

class TerminateMiddleware {
   public function handle($request, Closure $next) {
      echo "Executing statements of handle method of TerminateMiddleware.";
      return $next($request);
   }
   
   public function terminate($request, $response) {
      echo "<br>Executing statements of terminate method of TerminateMiddleware.";
   }
}

Step 4 - ลงทะเบียนไฟล์ TerminateMiddleware ใน app\Http\Kernel.phpไฟล์. เพิ่มบรรทัดที่เน้นด้วยสีเทาในไฟล์นั้นเพื่อลงทะเบียน TerminateMiddleware

Step 5 - ดำเนินการคำสั่งต่อไปนี้เพื่อสร้าง ABCController.

php artisan make:controller ABCController --plain

Step 6 - หลังจากดำเนินการ URL สำเร็จคุณจะได้รับผลลัพธ์ต่อไปนี้ -

Step 7 - คัดลอกรหัสต่อไปนี้ไปที่ app/Http/ABCController.php ไฟล์.

app/Http/ABCController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;

class ABCController extends Controller {
   public function index() {
      echo "<br>ABC Controller.";
   }
}

Step 8 - เพิ่มบรรทัดของรหัสต่อไปนี้ใน app/Http/routes.php ไฟล์.

app/Http/routes.php

Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => 'ABCController@index',
]);

Step 9 - ไปที่ URL ต่อไปนี้เพื่อทดสอบมิดเดิลแวร์ที่สามารถยุติได้

http://localhost:8000/terminate

Step 10 - ผลลัพธ์จะปรากฏดังที่แสดงในภาพต่อไปนี้