در معماری لاراول، Middlewareها لایههایی هستند که میان درخواست کاربر (Request) و پاسخ نهایی (Response) قرار میگیرند. هر درخواست پیش از رسیدن به کنترلر از مجموعهای از Middlewareها عبور میکند. هر Middleware میتواند درخواست را بررسی، تغییر یا حتی متوقف کند و پاسخ مناسب بازگرداند.
بهعنوان مثال، اگر کاربر وارد سیستم نشده باشد، Middleware بررسی احراز هویت او را انجام داده و در صورت لزوم او را به صفحه ورود هدایت میکند. این منطق در تمامی مسیرهای محافظتشده اجرا میشود.

تخصیص میدلویرها
برای تخصیص میدلویرها به مسیرهای پروژه سه مسیر پیش روی ماست که در ادامه آنها را بررسی میکنیم. شما به عنوان برنامهنویس باید تصمیم بگیرید که کدام میدلویرها به چه ترتیبی و چه زمانی روی کدام مسیرها اجرا شوند. دقت کنید که اجرای میدلویرها با هزینه همراه است و در این بخش هم به بهینهسازی باید توجه کافی را داشته باشید.
استفاده از میدلویرها همچنین میتواند برای بهینهسازی و سیستمهای کشینگ به کار برود. یک میدلویر میتواند قبل از اجرای کدهای منطق برنامه، وارد عمل شود، فعالیتهایی برای اجرای روانتر مسیرها به انجام برساند یا در صورت نیاز از مسیرهای میانگین و سریعتر پاسخ مورد نیاز را تولید کند و برگرداند.
در ادامه روشهای فراخوانی میدلویرها را مشاهده میکنید:
۱- سراسری (Global):
روی تمام مسیرهای برنامه اعمال میشوند. در فایل زیر ثبت میشوند:
// app/Http/Kernel.php protected $middleware = [ \Illuminate\Http\Middleware\HandleCors::class, \App\Http\Middleware\TrustProxies::class, ];
۲- گروهی (Group):
برای مجموعهای از مسیرها، مانند web یا api:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
],
'api' => [
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
],
];
۳- ویژه مسیر (Route Middleware):
برای اعمال کردن یک میدلویر تنها روی یک مسیر خاص به شکل زیر عمل میکنیم:
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, ];
ساخت Middleware جدید
برای ایجاد یک Middleware ساده دستور زیر را اجرا میکنیم:
php artisan make:middleware AgeMiddleware
کلاس ساختهشده در مسیر زیر قرار میگیرد:
app/Http/Middleware/AgeMiddleware.php
به مثال زیر توجه کنید:
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class AgeMiddleware
{
public function handle(Request $request, Closure $next)
{
if ($request->age < 18) {
return redirect('no-access');
}
return $next($request);
}
}
ثبت و استفاده از Middleware
برای اینکه آسانتر بتوانید از میدلویرها استفاده کنید، بهتر است یک نام رشتهای کوتاه و سراسری برایشان تعریف کنید تا دسترسی به آن بدون مسیر کلاس امکانپذیر باشد.
برای انجام این کار در app/Http/Kernel.php به شکل زیر نام اختصاری برای Middleware تعریف میکنیم:
protected $routeMiddleware = [
'age' => \App\Http\Middleware\AgeMiddleware::class,
];
برای استفاده از این میدلویر در Route به شکل زیر عمل میکنیم:
Route::get('/restricted', function () {
return view('restricted');
})->middleware('age');
امکان تخصیص چند میدلویر به یک مسیر هم وجود دارد. میدلویرها به ترتیب فراخوانی میشوند و هر یک میتوانند روند اجرا را متوقف کنند. بنابراین ترتیب آنها باید به دقت رعایت شود:
Route::get('/dashboard', function () {
//
})->middleware(['auth', 'verified', 'age']);
اعمال تغییر پس از پاسخ
Middlewareها میتوانند پس از اجرای درخواست نیز روی پاسخ نهایی کار کنند، مثلا برای افزودن هدر:
public function handle(Request $request, Closure $next)
{
$response = $next($request);
$response->headers->set('X-App-Version', '1.0');
return $response;
}
میدلویرها در لاراول یک ابزار حرفهای هستند که به شما کمک میکنند تا سطح امنیت پروژه به مقدار قابل توجهی افزایش دهید و از احتمال اشتباه و فراموشی و نوشتن کدهای نادرست دور بمانید.
