uiibevy/flutzig

在 Flutter 中使用 Laravel 命名路由。

1.0.0 2024-04-18 17:05 UTC

This package is auto-updated.

Last update: 2024-09-18 18:03:20 UTC


README

Flutzig - Use your Laravel routes in Flutter

Flutzig – 在 Flutter 中使用 Laravel 路由

GitHub Actions Status Latest Version on Packagist Downloads on Packagist

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 并添加 一个 包含路由名称模式数组的 onlyexcept 键。

注意:您必须选择其中之一。同时设置 onlyexcept 将会禁用过滤并返回所有命名路由。

// config/flutzig.php

return [
    'only' => ['home', 'posts.index', 'posts.show'],
];

您可以在路由过滤器中使用星号作为通配符。在下面的示例中,admin.* 将排除名为 admin.loginadmin.register 等 的路由。

// config/flutzig.php

return [
    'except' => ['_debugbar.*', 'horizon.*', 'admin.*'],
];

使用分组过滤

您还可以使用配置文件中的 groups 键来定义您希望在应用程序的不同位置可用的路由组。

// config/flutzig.php

return [
    'groups' => [
        'admin' => ['admin.*', 'users.*'],
        'author' => ['posts.*'],
    ],
];

贡献

要开始为 Flutzig 做贡献,请查看 贡献指南

鸣谢

许可证

Flutzig 是在 MIT 许可证下发布的开源软件。有关更多信息,请参阅 LICENSE