مسیریابی
مسیرها در فینچ با استفاده از اشیاء FinchRoute که درون یک تابع مسیریابی جمعآوری شدهاند، تعریف میشوند. تابع مسیریابی با app.addRouting() ثبت شده و برای هر درخواست ورودی فراخوانی میشود.
تابع مسیریابی
import 'package:finch/finch_route.dart';
import '../controllers/home_controller.dart';
final homeController = HomeController();
Future<List<FinchRoute>> getWebRoute(Request rq) async {
return [
FinchRoute(
key: 'root',
path: '/',
methods: Methods.ONLY_GET,
index: homeController.index,
),
];
}
در app.dart ثبت کنید:
app.addRouting(getWebRoute);
پارامترهای FinchRoute
| پارامتر | نوع | توضیح |
|---|---|---|
key |
String |
شناسه منحصربهفرد مسیر. برای تولید URL استفاده میشود ($e.routeUrl('key')) |
path |
String |
بخش مسیر URL. از {param} و wildcard * پشتیبانی میکند |
methods |
List<String> |
متدهای HTTP مجاز. از ثابتهای Methods استفاده کنید |
index |
Future<String> Function()? |
تابع handler (بدون پارامتر rq؛ از Context.rq یا متد controller استفاده کنید) |
controller |
Controller? |
نمونه controller. index() آن هنگامی که index تنظیم نشده فراخوانی میشود |
children |
List<FinchRoute> |
مسیرهای فرزند تودرتو. مسیر نسبت به مسیر والد است |
extraPath |
List<String> |
مسیرهای اضافی که به همین مسیر map میشوند |
auth |
AuthController? |
نگهبان احراز هویت برای این مسیر |
permissions |
List<String> |
رشتههای دسترسی که پس از auth بررسی میشوند |
middlewares |
List<Middleware> |
زنجیره middleware که قبل از handler اجرا میشود |
hosts |
List<String> |
محدود کردن به hostnames خاص (['*'] = همه) |
ports |
List<int> |
محدود کردن به پورتهای خاص ([] = همه) |
params |
Map<String, dynamic> |
پارامترهای پیشفرض قالب |
excludePaths |
List<String> |
زیرمسیرهایی که از این مسیر مستثنا شدهاند |
apiDoc |
Future<ApiDoc>? Function()? |
مستندات API برای Swagger |
متدهای HTTP
// ثابتهای دسترسی از کلاس Methods:
Methods.ONLY_GET // ['GET']
Methods.ONLY_POST // ['POST']
Methods.ONLY_PUT // ['PUT']
Methods.ONLY_DELETE // ['DELETE']
Methods.GET_POST // ['POST', 'GET']
Methods.ALL // تمام متدهای HTTP استاندارد
// یا یک لیست سفارشی:
methods: [Methods.GET, Methods.POST, Methods.DELETE]
پارامترهای مسیر
از دستور {name} برای ضبط بخشهای URL استفاده کنید. آنها را در controller با rq.getParam('name') بخوانید:
FinchRoute(
key: 'users.show',
path: 'users/{id}',
methods: Methods.ONLY_GET,
index: userController.show,
),
// در UserController:
Future<String> show() async {
var id = rq.getParam('id');
return rq.renderData(data: {'id': id});
}
مسیرهای تودرتو (children)
مسیرهای فرزند نسبت به مسیر والد هستند:
FinchRoute(
key: 'example',
path: 'example',
index: homeController.redirectToRoot,
children: [
FinchRoute(
key: 'example.form.get',
path: 'form',
methods: Methods.ONLY_GET,
index: homeController.exampleForm,
),
FinchRoute(
key: 'example.panel',
path: 'panel',
methods: Methods.ALL,
auth: authController,
permissions: ['admin'],
index: homeController.exampleAuth,
),
],
),
مسیرهای اضافی
extraPath پیشوندهای URL اضافی را به همان مسیر map میکند:
FinchRoute(
key: 'root.mysql',
path: 'example/mysql',
extraPath: ['api/example/mysql'],
methods: Methods.GET_POST,
index: homeController.exampleMysql,
),
فیلتر host و port
یک مسیر را به hostها یا پورتهای خاص محدود کنید:
FinchRoute(
key: 'root.localhost',
path: 'example/host',
hosts: ['localhost'],
ports: [80, 8085],
index: homeController.renderLocalhost,
methods: Methods.ALL,
),
نگهبان احراز هویت
برای محافظت از یک مسیر یک AuthController ضمیمه کنید. اگر auth() مقدار false برگرداند، درخواست قبل از رسیدن به handler رد میشود:
FinchRoute(
key: 'admin.panel',
path: 'admin/panel',
auth: AppAuthController(),
permissions: ['admin'],
index: adminController.panel,
),
برای جزئیات پیادهسازی به Auth Controller مراجعه کنید.
کش مسیر
از پسوند .cache() برای کش کردن پاسخها استفاده کنید:
FinchRoute(
key: 'root.route',
path: 'example/route',
methods: Methods.ONLY_GET,
index: homeController.exampleRoute,
).cache(
cacheDuration: Duration(minutes: 10),
cacheType: [CacheParam.path, CacheParam.method, CacheParam.language],
cacheSource: CacheSource.file,
),
برای جزئیات کامل به Route Cache مراجعه کنید.
تولید URL از کلید مسیر
در قالبها، از $e.routeUrl('key') برای تولید URL استفاده کنید:
<a href="{{ $e.routeUrl('root') }}">صفحه اصلی</a>
<a href="{{ $e.routeUrl('users.show', {'id': user.id}) }}">نمایش کاربر</a>