درس 6 - Middleware در لاراول

آموزش Middleware در فریمورک لاراول

Middleware نقش پل ارتباطی بین درخواست ها و پاسخ ها در اپلیکیشن ساخته شده با فریمورک لاراول عمل میکند.

Middleware بعنوان یک فیلتر بین درخواست و پاسخ است و در این درس بصورت کامل و بنیادی بحث Middleware در فریمورک لاراول را یاد خواهید گرفت.

فریمورک لاراول دارای یک Middleware برای احراز هویت کاربران است که مشخص میکند کاربری که از سایت یا قسمتی از سایت بازدید میکند عمل ورود به سایت را انجام داده است یا نه ؟

این Middleware بررسی میکند و اگر کاربر قبلا ورود را انجام داده باشد آنرا به صفحه ی سایت هدایت میکند و در غیر این صورت کاربر را به صفحه ی ورود یا ثبت نام هدایت میکند.

در فریمورک لاراول Middleware ها به سادگی توسط دستور زیر ساخته میشود.

php artisan make:middleware <middleware-name>

در دستور بالا بجای <middleware-name> نام مد نظر خود برای Middleware را وارد کنید.

Middleware که شما ساختید اکنون در مسیر app/Http/Middleware قرار دارد و میتوانید مشاهده کنید.

یک مثال !

برای درک بهتر مفهوم Middleware در فریمورک لاراول به مثال زیر دقت کنید.

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

php artisan make:middleware AgeMiddleware

قدم دوم - اگر دستور بالا را به درستی اجرا کرده باشید خروجی زیر را خواهید داشت.

	 آموزش middleware ها در لاراول

قدم سوم - AgeMiddleware در مسیر  app/Http/Middleware لاراول ساخته شده است.کدهای زیر درون این فایل بصورت خودکار برای شما ساخته میشود.

<?php

namespace App\Http\Middleware;
use Closure;

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

 

Register کردن Middleware در فریمورک لاراول

نکته ی مهم درباره ی middleware ها این است که قبل از استفاده از هر middleware باید آنرا رجیستر کنیم .  در فریمورک لاراول دو نوع middleware بصورت کلی وجود دارد:

  • Global Middleware
  • Route Middleware

نوع Global Middleware روی تمامی درخواست های مبتنی بر ‌http نظارت دارد درحالیکه ‌Route Middleware روی یک route خاص نظارت میکند.

middleware ها باید در فایل app/Http/Kernel.php لاراول تعریف شوند. در این فایل دو نوع خاصیت به نام های $middleware $routeMiddleware وجود دارد.

خاصیت $middleware برای رجیستر کردن Global Middleware ها به کار برده میشود و
$routeMiddleware برای رجیستر کردن route specific middleware کاربرد دارد.

برای رجیستر کردن یک global middleware جدید به آخر لیست $middleware آنرا اضافه کنید. در زیر محتویات لیست $middleware را مشاهده میکنید.

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 را باید بروزرسانی کنید و route middleware جدید را به انتهای لیست اضافه کنید.

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

 

مثال 

ما در مثال قبلی یک AgeMiddleware ایجاد کردیم. ما میتوانید این middleware لاراول را بعنوان یک route middleware ثبت کنیم. در کدهای زیر نحوه ی تعریف آنرا مشاهده میکنید.

کد زیر محتویات 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 یک تابعی را برای آن باید داشته باشیم و پارامترها را توسط آرگومان  $next ارسال کنیم.مثال زیر را ببینید.

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

 

مثال

 

با استفاده از دستور زیر یک middleware به نام RoleMiddleware بسازید.

php artisan make:middleware RoleMiddleware

بعد از اجرای دستور بالا نتیجه باید به شکل تصویر زیر باشد .

آموزش middleware های لاراول

متود handle را به middleware که جدیدا ساختیم اضافه کنید. این middleware در آدرس 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);
   }
}

RoleMiddleware را در فایل app\Http\Kernel.php رجیستر کنید. در تصویر زیر چیزی که اضافه خواهد شد زیرش خط کشیده شده است.

آموزش رجیستر کردن middleware ها در لاراول

برای ساختن یک کنترلر جدید در فریمورک لاراول به نام TestController دستور زیر را در ترمینال یا کامند پرومپ اجرا کنید.

php artisan make:controller TestController --plain

بعد از اجرای کد بالا نتیجه باید مشابه تصویر زیر باشد.

آموزش ساخت Controller در فریمورک Laravel

کدهای زیر را در مسیر 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 اضافه کنید. البته در نسخه های جدید محل route ها تغییر پیدا کرده است و باید به مسیر routes/web.php بروید.

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

مرورگر خود را باز کنید و به آدرس زیر بروید تا middleware به همراه پارامتر را تست کنید.

http://localhost:8000/role

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

آموزش middleware ها در لاراول

 

Middleware از نوع terminate در لاراول

متود terminate باعث میشود برخی کارها بعد از ارسال پاسخ به مرورگر انجام شود. این middleware ها با ساختن متود terminate در درون middleware ایجاد میشوند.

این نوع از Middleware ها باید بعنوان global middleware رجیستری شوند.

متود terminate دو آرگومان ورودی میگیرد به نام های $request و $response.

متود terminate middleware های لاراول طبق مثال زیر قابل ایجاد و استفاده است.

مثال 

قدم 1 - با اجرای دستور زیر در ترمینال یا کامند پرومپ یک میدلور به نام TerminateMiddleware بسازید.

php artisan make:middleware TerminateMiddleware

قدم 2 - دستور بالا نتیجه ای مشابه به تصویر زیر خواهد داشت.

آموزش terminate middleware در فریمورک Laravel

قدم 3 - کدهای زیر را در فایل middleware جدید که ساختید کپی کنید مسیر فایل باید اینجا باشد 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.";
   }
}

قدم 4 - در فایل app\Http\Kernel.php میتوانید رجیستر برای TerminateMiddleware را انجام دهید.

در تصویر زیر خطی که زیرش خط کشیده شده است را باید اضافه کنید.

آموزش terminate middleware در لاراول

قدم 5 - دستور زیر را در ترمینال یا کامند پرومپ جهت ایجاد کنترلر جدید اجرا کنید.

php artisan make:controller ABCController --plain

قدم 6 - بعد از اجرای دستور بالا نتیجه باید مشابه تصویر زیر باشد.

آموزش میدلور ها ( middleware ) در لاراول

قدم 7 - کد زیر را در فایل 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.";
   }
}

قدم 8 - کد زیر را به فایل route لاراول که در نسخه های جدید در routes/web.php است و در نسخه های قدیمی لاراول app/Http/routes.php اضافه کنید.

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

قدم 9 - برای تست کردن متود terminate middleware لاراول به آدرس زیر توسط مرورگر مراجعه کنید.

http://localhost:8000/terminate

قدم 10 - خروجی باید مشابه تصویر زیر باشد.

آموزش متود terminate در middleware های فریمورک لاراول

اتمام درس