میدلور (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);
});
ترتیب اجرا اهمیت دارد
میدلور احراز هویت، محدودسازی نرخ و بررسی مجوز باید با ترتیب صحیح قرار گیرند. خطا در ترتیب میتواند پاسخ غیرمنتظره یا مشکل امنیتی ایجاد کند.
برای ارتباط با دیزاین پترن چین آو ریسپانسیبیلیتی، کنترلر و رابط برنامهنویسی کاربردی هم مطالعه کنید.