کنترلرها
کنترلرها منطق مدیریت درخواست را در فینچ کپسوله میکنند. یک کنترلر کلاسی است که از Controller ارثبری میکند و به شیء درخواست جاری از طریق rq دسترسی میدهد.
ساختار پایه
import 'package:finch/finch_route.dart';
class HomeController extends Controller {
Future<String> index() async {
return rq.renderView(path: 'home/index');
}
}
برای دسترسی به کنترلر در مسیریابی:
final homeController = HomeController();
FinchRoute(
key: 'root',
path: '/',
methods: Methods.ONLY_GET,
index: homeController.index,
),
شیء rq
rq (کوتاهشده برای request) شیء مرکزی موجود در هر متد کنترلر است. این شیء دسترسی به دادههای درخواست، متدهای پاسخ، session، کوکیها، زبان و موارد دیگر را فراهم میکند.
متدهای پاسخ
| متد | توضیح |
|---|---|
rq.renderView(path: '...') |
رندر یک قالب Jinja. مسیر نسبت به widgetsPath است |
rq.renderData(data: {...}) |
بازگرداندن پاسخ JSON |
rq.renderError(status: 404) |
ارسال پاسخ خطای HTTP |
rq.renderString(text: '...') |
بازگرداندن متن ساده یا HTML |
rq.redirect(url: '...') |
هدایت مجدد به URL |
rq.renderNotFound() |
بازگرداندن ۴۰۴ |
رندر یک قالب
Future<String> index() async {
return rq.renderView(
path: 'home/index', // مسیر نسبت به widgetsPath بدون پسوند
params: {
'title': 'صفحه اصلی',
'user': currentUser,
},
);
}
بازگرداندن JSON
Future<String> apiUser() async {
var id = rq.getParam('id');
var user = await UserModel().find(id: id);
return rq.renderData(data: user?.toJson() ?? {});
}
خواندن دادههای درخواست
// پارامترهای query/form
var name = rq.get<String>('name', def: '');
var age = rq.get<int>('age', def: 0);
// پارامترهای مسیر (/users/{id})
var id = rq.getParam('id');
// Body خام JSON
var body = await rq.getBodyAsJson();
// فایل آپلودی
var file = rq.getFile('avatar');
ویژگیهای درخواست
rq.method // 'GET', 'POST', …
rq.path // '/users/42'
rq.ip // آدرس IP کلاینت
rq.headers // Map<String, List<String>>
rq.isJson // آیا Content-Type برابر application/json است
rq.currentLanguage // کد زبان جاری
ارسال داده به قالب
علاوه بر params درون متد renderView، میتوانید پارامترها را برای کل مسیر در تعریف FinchRoute تعیین کنید:
FinchRoute(
key: 'root',
path: '/',
params: {'siteName': 'فینچ دمو'},
index: homeController.index,
),
دادههای سطح route با دادههای سطح controller در renderView ادغام میشوند.
خطاهای HTTP
// ارسال ۴۰۳ Forbidden
return rq.renderError(status: 403, message: 'دسترسی ممنوع');
// ارسال ۵۰۰ Internal Server Error
return rq.renderError(status: 500);