فهرست:

مقدمه آشنایی با Middleware در لاراول

Middleware به عنوان یک رابط بین request و response عمل می کند و در واقع نوعی مکانیسم بررسی است. در این مبحث Middleware را بطور اختصاری برای شما شرح می دهیم. به عنوان مثال فرض کنید باید کاربری را احراز هویت کنیم، با کمک Middleware می توانیم بررسی کنیم کاربری که وارد ساید شده است به صفحه اصلی هدایت و در غیر این صورت به صفحه ورود هدایت شود. Middleware را می توان با اجرای دستور زیر ایجاد کرد.

php artisan make:middleware <middleware-name>

در خط فرمان بالا می توانید را با نام Middleware خود جایگزین کنید. Middleware ایجاد شده را می توانید در فهرست app/Http/Middleware مشاهده کنید. برای درک بهتر مثال زیر را بررسی می کنیم. مرحله اول: AgeMiddleware را ایجاد با دستور زیر ایجاد می کنیم.

php artisan make:middleware AgeMiddleware

مرحله دوم: AgeMiddleware در app/ Http/Middleware ایجاد خواهد شد. فایل جدید ایجاد شده دارای کد زیر است.

app/Http/Middleware
<?php

namespace App\Http\Middleware;
use Closure;

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

رجیستر کردن Middleware در لاراول

ما به دو صورت می توانیم Middleware در لاراول تعریف نماییم:

  • Global Middleware
  • Route Middleware

در لاراول Global Middleware بر روی هر درخواست HTTP از برنامه اجرا می شود، در حالی که Middleware Route به یک مسیر خاص اختصاص می یابد. Middleware را می توان در app/Http/Kernel.php تعریف نمود. در این فایل دو متغیر $middleware و $routeMiddleware وجود دارند، از $middleware برای تعریف Middleware Global و از $routeMiddleware برای Route Middleware برای یک Route خاص استفاده می شود. برای بکار بردن Global Middleware از متغیر $middleware بصورت زیر استفاده می کنیم.

app/Http/Kernel.php
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,
];

برای بکار بردن Route Middleware از متغیر $routeMiddleware بصورت زیر استفاده می کنیم.

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

در مثال قبل AgeMiddleware را ایجاد کرده ایم. اکنون می توانیم آن را در دو ویژگی Global Middleware و Route Middleware بصورت زیر در فایل app/Http/Kernel.php تعریف کنیم.

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,
   ];
}

پارامتر ها در Middleware

ما همچنین می توانیم پارامترها را با Middleware پاس دهیم به عنوان مثال ، اگر برنامه شما دارای رول های مختلفی مانند user ، admin ، super admin و غیره باشد، می توانید اعتبار سنجی خود را بر مبنای سطوح دسترسی مختلف با پاس دادن پارامتر در Middleware انجام دهید. برای این منظور Middleware مورد نظر را با همانند function زیر با آرگومان سفارشی خود و پس از آرگومان $next ایجاد می کنیم.

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

برای درک بهتر این مورد به مثال زیر دقت کنید ابتدا با خط فرمان زیر RoleMiddleware را ایجاد می کنیم.

php artisan make:middleware RoleMiddleware

کد زیر را به فایل ایجاد شده برای RoleMiddlewareat در مسیر 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);
   }
}

RoleMiddleware را در فایل app/Http/Kernel.php همانند خط هایلایت شده در خط هفتم مثال زیر رجیستر کنید.

app/Http/Kernel.php
class Kernel extends HttpKernel {
   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,
	  'Role' => \App\Http\Middleware\RoleMiddleware::class,
   ];
}

حال با خط فرمان زیر TestController را ایجاد نمایید.

php artisan make:controller TestController --plain

حال به فایل 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.";
   }
}

به فایل app/Http/routes.php مراجعه و کد زیر را در آن قرار دهید. با اضافه کردن یک دونقطه (:) بعد از اسم میدل‌ور، می‌تونیم پارامتر پاس بدیم.

app/Http/routes.php
Route::get('role',[
   'middleware' => 'Role:editor',
   'uses' => 'TestController@index',
]);

بسیار خوب کار تمام است برای بررسی پارامتر ها در Middleware در مثال فوق به آدرس زیر مراجعه نمایید.

http://localhost:8000/role

خروجی مرورگر شما بصورت زیر خواهد بود.

Role:editor
Test Controller.

Terminable Middleware

چنانچه قصد داشته باشید بعد از ارسال response به مرورگر یک فرایند مشخص انجام شود از Terminable Middleware استفاده می کنیم. Terminable Middleware ها بصورت global middleware رجیستر خواهند شد و دو آرگومان $request و $response را دریافت می کنند.

برای درک بهتر این مورد به مثال زیر دقت کنید ابتدا با خط فرمان زیر TerminateMiddleware را ایجاد می کنیم.

php artisan make:middleware TerminateMiddleware

کد زیر را به فایل ایجاد شده برای TerminateMiddleware در مسیر app/Http/Middleware/TerminateMiddleware.php اضافه کنید.

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.";
   }
}

TerminateMiddleware را در فایل app/Http/Kernel.php همانند خط هایلایت شده در خط هشتم مثال زیر رجیستر کنید.

app/Http/Kernel.php
class Kernel extends HttpKernel {
   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,
	  'Role' => \App\Http\Middleware\RoleMiddleware::class,
	  'terminate' => \App\Http\Middleware\TerminateMiddleware::class,
   ];
}

حال با خط فرمان زیر ABCController را ایجاد نمایید.

php artisan make:controller ABCController --plain

حال به فایل 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.";
   }
}

به فایل app/Http/routes.php مراجعه و کد زیر را در آن قرار دهید.

app/Http/routes.php
Route::get('terminate',[
   'middleware' => 'terminate',
   'uses' => 'ABCController@index',
]);

بسیار خوب کار تمام است به آدرس زیر مراجعه نمایید.

http://localhost:8000/terminate

خروجی مرورگر شما بصورت زیر خواهد بود.

Executing statements of handle method of TerminateMiddleware.
ABC Controller.
Executing statements of terminate method of TerminateMiddleware.