Middleware
Middleware ها قبل از رسیدن درخواست به controller اجرا میشوند. میتوانند درخواست را تغییر دهند، پارامترها اضافه کنند، یا پاسخ را متوقف کنند.
ساخت یک Middleware
import 'package:finch/finch_route.dart';
class AuthMiddleware extends Middleware {
@override
Future<MiddlewareResult> handle(FinchRequest rq) async {
var token = rq.headers['authorization']?.first ?? '';
if (token.isEmpty) {
return MiddlewareResult.stop(
rq.renderData(
data: {'error': 'احراز هویت لازم است'},
statusCode: 401,
),
);
}
var user = await UserService.verifyToken(token);
if (user == null) {
return MiddlewareResult.stop(
rq.renderData(
data: {'error': 'توکن نامعتبر است'},
statusCode: 401,
),
);
}
// اضافه کردن user به پارامترهای درخواست
rq.addParam('currentUser', user);
return MiddlewareResult.next();
}
}
مقادیر بازگشتی MiddlewareResult
| مقدار | رفتار |
|---|---|
MiddlewareResult.next() |
ادامه پردازش به middleware/controller بعدی |
MiddlewareResult.stop(response) |
توقف پردازش و بازگرداندن پاسخ |
اتصال Middleware به Route
در constructor
router.get(
'/dashboard',
DashboardController().index,
middlewares: [AuthMiddleware()],
);
به صورت fluent
router
.get('/dashboard', DashboardController().index)
.middleware(AuthMiddleware());
Middleware برای Route والد
router.group('/api', (r) {
r.get('/users', UserController().index);
r.post('/users', UserController().store);
}).middleware(ApiAuthMiddleware());
دسترسی به درخواست در Controller
Future<String> index() async {
var user = rq.getParam<User>('currentUser');
// استفاده از user...
}