میدلور (Middleware) لایه‌ای است که پیش یا پس از پردازش درخواست HTTP اجرا می‌شود و می‌تواند درخواست را بررسی، تغییر، رد یا به جزء بعدی منتقل کند. میدلور فقط مخصوص لاراول نیست و در اکسپرس، جنگو، ASP.NET Core و فریم‌ورک‌های دیگر نیز وجود دارد.

تعریف میدلور در Laravel

php artisan make:middleware RequireStoreHeader
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;

final class RequireStoreHeader {
    public function handle(Request $request, Closure $next) {
        if (! $request->hasHeader('X-Store-Id')) {
            abort(400, 'Missing store header');
        }
        return $next($request);
    }
}

استفاده در Route و Controller لاراول

Route::get('/orders', [OrderController::class, 'index'])
    ->middleware(RequireStoreHeader::class);

// In modern Laravel, controller-level middleware may be declared
// via Illuminate\Routing\Controllers\HasMiddleware.
class OrderController implements HasMiddleware {
    public static function middleware(): array {
        return [RequireStoreHeader::class];
    }
}

در نسخه‌های قدیمی‌تر لاراول، افزودن میدلور در Constructor کنترلر نیز وجود داشت. راه توصیه‌شده و امضای API را بر اساس نسخه پروژه بررسی کنید.

نمونه Express.js

function requireStore(req, res, next) {
  if (!req.headers['x-store-id']) return res.status(400).send('Missing store');
  next();
}
app.get('/orders', requireStore, ordersController);

نمونه Django

class StoreHeaderMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
    def __call__(self, request):
        if "X-Store-Id" not in request.headers:
            from django.http import HttpResponseBadRequest
            return HttpResponseBadRequest("Missing store")
        return self.get_response(request)

نمونه ASP.NET Core

app.Use(async (context, next) => {
    if (!context.Request.Headers.ContainsKey("X-Store-Id")) {
        context.Response.StatusCode = 400;
        return;
    }
    await next(context);
});

ترتیب اجرا اهمیت دارد

میدلور احراز هویت، محدودسازی نرخ و بررسی مجوز باید با ترتیب صحیح قرار گیرند. خطا در ترتیب می‌تواند پاسخ غیرمنتظره یا مشکل امنیتی ایجاد کند.

برای ارتباط با دیزاین پترن چین آو ریسپانسیبیلیتی، کنترلر و رابط برنامه‌نویسی کاربردی هم مطالعه کنید.