uiibevy / flutzig
在 Flutter 中使用 Laravel 命名路由。
Requires
- php: >=8.1
- ext-json: *
- laravel/framework: >=9.0
Requires (Dev)
- orchestra/testbench: ^7.0 || ^8.0 || ^9.0
- pestphp/pest: ^2.3
- pestphp/pest-plugin-drift: ^2.6
README
Flutzig – 在 Flutter 中使用 Laravel 路由
flutzig 提供了一个 JavaScript route() 函数,其工作方式类似于 Laravel 的,使得在 JavaScript 中使用命名的 Laravel 路由变得非常容易。
安装
使用 Composer 在您的 Laravel 应用中安装 Flutzig
composer require uiibevy/flutzig
使用 pub 在您的 flutter 应用中安装 Flutzig
pub get flutzig
在您的 Flutter 应用中添加 Flutzig 初始化
void main() async { await Flutzig.init(); runApp(const MyApp()); }
使用
route() 函数
flutzig 的 route() 函数与 Laravel 的 route() 助手 的工作方式相同——您可以传递路由名称和要传递给路由的参数,它将生成一个 URL。
基本用法
Route::get('posts', fn (Request $request) => /* ... */)->name('posts.index');
route(name: 'posts.index'); // 'https://flutzig.test/posts'
参数
Route::get('posts/{post}', fn (Post $post) => /* ... */)->name('posts.show');
route(name: 'posts.show', params: { post: 1 }); // 'https://flutzig.test/posts/1'
多个参数
Route::get('venues/{venue}/events/{event}', fn (Venue $venue, Event $event) => /* ... */) ->name('venues.events.show');
route(name: 'venues.events.show', params: { venue: 1, event: 2 }); // 'https://flutzig.test/venues/1/events/2'
查询参数
flutzig 将不匹配任何命名路由参数的参数作为查询参数添加
Route::get('venues/{venue}/events/{event}', fn (Venue $venue, Event $event) => /* ... */) ->name('venues.events.show');
route(name: 'venues.events.show', params: { venue: 1, event: 2, page: 5, count: 10, }); // 'https://flutzig.test/venues/1/events/2?page=5&count=10'
如果您需要传递与路由参数同名的查询参数,请将其嵌套在特殊的 query_ 键下
route(name: 'venues.events.show', params: { venue: 1, event: 2, query_: { event: 3, page: 5, }, }); // 'https://flutzig.test/venues/1/events/2?event=3&page=5'
与 Laravel 一样,Flutzig 自动将布尔查询参数编码为整数,并添加到查询字符串中
route(name: 'venues.events.show', params: { venue: 1, event: 2, query_: { draft: false, overdue: true, }, }); // 'https://flutzig.test/venues/1/events/2?draft=0&overdue=1'
默认参数值
flutzig 支持 Laravel 的默认路由参数值 (Laravel 文档)。
Route::get('{locale}/posts/{post}', fn (Post $post) => /* ... */)->name('posts.show');
// app/Http/Middleware/SetLocale.php URL::defaults(['locale' => $request->user()->locale ?? 'de']);
route(name: 'posts.show', params: 1); // 'https://flutzig.test/de/posts/1'
示例
使用 dio 进行 HTTP 请求
final post = { 'id': 1, 'title': 'Flutzig Stardust' }; final response = await Dio.get(route('posts.show', post)); print(response);
Router 类
不传递任何参数调用 flutzig 的 route() 函数将返回其 JavaScript Router 类的实例,该类具有一些其他有用的属性和方法。
检查当前路由:route().current()
即将推出!
检查是否存在路由:route().has()
即将推出!
路由-模型绑定
Flutzig 支持 Laravel 的 路由-模型绑定,甚至可以识别自定义路由键名。如果您将 Dart 对象作为路由参数传递给 route(),Flutzig 将使用为该路由注册的路由-模型绑定键来查找对象中的正确参数值。如果没有为参数显式注册路由-模型绑定键,Flutzig 将使用对象的 id 键。
// app/Models/Post.php class Post extends Model { public function getRouteKeyName() { return 'slug'; } }
Route::get('blog/{post}', function (Post $post) { return view('posts.show', ['post' => $post]); })->name('posts.show');
final post = { id: 3, title: 'Introducing flutzig v1', slug: 'introducing-flutzig-v1', date: '2020-10-23T20:59:24.359278Z', }; // Flutzig knows that this route uses the 'slug' route-model binding key: route(name: 'posts.show', params: post); // 'https://flutzig.test/blog/introducing-flutzig-v1'
flutzig 还支持在路由定义中直接声明的 自定义键 用于范围绑定
Route::get('authors/{author}/photos/{photo:uuid}', fn (Author $author, Photo $photo) => /* ... */) ->name('authors.photos.show');
final photo = { uuid: '714b19e8-ac5e-4dab-99ba-34dc6fdd24a5', filename: 'sunset.jpg', } route(name: 'authors.photos.show', params: [{ id: 1, name: 'Ansel' }, photo]); // 'https://flutzig.test/authors/1/photos/714b19e8-ac5e-4dab-99ba-34dc6fdd24a5'
生成和导入 flutzig 的配置
Flutzig 提供了一个 Artisan 命令,用于将配置和路由输出到文件
php artisan flutzig:generate
此命令默认将您的配置放置在 storage/public/flutzig/routes.json,但您可以通过传递参数给 Artisan 命令或设置 flutzig.output.path 配置值来自定义此路径。
由 flutzig:generate 命令创建的文件看起来如下所示
// storage/public/flutzig/routes.json { url: 'https://flutzig.test', port: null, routes: { home: { uri: '/', methods: [ 'GET', 'HEAD'], domain: null, }, login: { uri: 'login', methods: ['GET', 'HEAD'], domain: null, }, }, };
过滤路由
Flutzig 支持过滤其输出的路由列表,如果您有一些不希望在 JSON 导出中包含和可见的路由,这非常有用。
重要
从 flutzig 的输出中隐藏路由并不能替代彻底的认证和授权。应该通过认证保护不应公开访问的路由,无论它们是否被过滤出 flutzig 的输出。
包含/排除路由
要设置路由过滤,在您的 Laravel 应用中创建一个配置文件 config/flutzig.php 并添加 一个 包含路由名称模式数组的 only 或 except 键。
注意:您必须选择其中之一。同时设置
only和except将会禁用过滤并返回所有命名路由。
// config/flutzig.php return [ 'only' => ['home', 'posts.index', 'posts.show'], ];
您可以在路由过滤器中使用星号作为通配符。在下面的示例中,admin.* 将排除名为 admin.login、admin.register 等 的路由。
// config/flutzig.php return [ 'except' => ['_debugbar.*', 'horizon.*', 'admin.*'], ];
使用分组过滤
您还可以使用配置文件中的 groups 键来定义您希望在应用程序的不同位置可用的路由组。
// config/flutzig.php return [ 'groups' => [ 'admin' => ['admin.*', 'users.*'], 'author' => ['posts.*'], ], ];
贡献
要开始为 Flutzig 做贡献,请查看 贡献指南。
鸣谢
许可证
Flutzig 是在 MIT 许可证下发布的开源软件。有关更多信息,请参阅 LICENSE。
