vaened/laroute

一个增强的 Laravel 扩展,可以将命名路由导出到 JavaScript 中,允许您使用路由名称而不是 URL。支持按模块化应用进行路由分组。

v1.0 2024-08-23 20:44 UTC

This package is auto-updated.

Last update: 2024-09-23 21:36:00 UTC


README

Build Status Software License

vaened\laroute 是一个受 aaronlord/laroute 启发的 PHP 库,旨在帮助 Laravel 开发者在不硬编码 URL 的情况下管理其应用的 JavaScript 路由。该库通过引入模块化路由更进一步,允许您根据 URL 模式将路由分离到不同的模块中。每个模块生成自己的路由文件,这使得管理您的应用路由结构变得更加容易和可扩展。

routes-example

安装

Laroute 需要 PHP 8.2。要获取最新版本,只需使用 Composer 需求项目。

composer require vaened/laroute

发布配置文件。

php artisan vendor:publish --tag='laroute'

现在,根据您的配置生成路由并导出 JavaScript 服务。

php artisan laroute:generate

用法

该库包含必要的 javascript 服务来解释导出的路由,以及相应的 d.ts 类型定义,用于 typescript

在配置文件中的库选项中配置了服务的位置。

JavaScript / Typescript

一旦服务被导出到配置文件中定义的位置,您就可以轻松创建一个新文件,并通过传递包含路由的文件作为参数来导出服务创建。

import {RouteService} from "./laroute";
import routes from "./api-routes.json";

const apiRouteService = new RouteService({routes});

现在您可以开始了。

const response = await fetch(apiRouteService.generateFullURL('store.products.lists'))
const data = response.json();
console.log(data)

此外,您可以将路由导出为 TypeScript 文件,以在您的编辑器中启用路由自动完成。要实现此目的,只需修改配置文件中的 output 选项。

routes-example

服务

路由服务提供了三个关键方法来与生成的路由交互

  • generateFullURL(name, ?params):生成完整的 URL,包括任何查询字符串参数。
apiRouteService.generateFullURL('admin.products.create', {
    id: '80768395-4208-4fd7-ac60-c429717014ab',
    name: 'Notebook'
})

返回 {host}/api/admin/products/80768395-4208-4fd7-ac60-c429717014ab?name=Notebook

  • createURLWithoutQuery(name, ?params):生成不带任何查询字符串的完整 URL。
apiRouteService.createURLWithoutQuery('admin.products.update', {
    id: '80768395-4208-4fd7-ac60-c429717014ab',
    name: 'Notebook'
})

返回 {host}/api/admin/products/80768395-4208-4fd7-ac60-c429717014ab

  • has(name):检查服务中是否定义了特定路由。
apiRouteService.has('admin.products.list')

如果路由存在,返回 true,否则返回 false

最佳实践

为了有效地管理 API 调用,建议创建一个专用文件。您可以将其命名为 Router.{ts, js}。在此文件中,您可以使用 fetch 或像 axios 这样的库来简化您的 API 交互。您可能导出的示例可能如下所示

import createRouteService, {Parameters} from "./laroute";
import axios, {AxiosRequestConfig, AxiosResponse} from "axios";
import api from "./api.json";

const apiRouteService = createRouteService(api);

export const Router = {
    get(routeName: string, params: Parameters = {}, config: AxiosRequestConfig = {}) {
        return axios.get(apiRouteService.cleanURI(routeName, params), {params, ...config});
    },

    post(routeName: string, params: Parameters = {}, config: AxiosRequestConfig = {}) {
        return axios.post(apiRouteService.cleanURI(routeName, params), params, config);
    },

    patch(routeName: string, params: Parameters = {}, config: AxiosRequestConfig = {}) {
        return axios.patch(apiRouteService.cleanURI(routeName, params), params, config);
    },
    // ...
};

配置

默认配置对于大多数项目来说是足够的,允许您简单地导出路由并开始工作,而无需任何额外的设置。

有关自定义选项,请参阅配置文件中的注释 laroute.php

高级

对于大型项目,其中不同的客户端消耗 API,您可以根据模块化方式配置路由导出。这允许您创建所需数量的模块,每个模块对应不同的 URL 段。

例如,您可以为 /api/store 创建一个模块,为 /api/admin 创建另一个模块,这将生成两个单独的路由文件。

'modules' => [
  [  
    'match'    => '/api/store',
    'name'     => 'store',
    'rootUrl'  => 'https://store.aplication.com',  
    'absolute' => true,
    'path'     => 'resources/routes',
  ],  
  [  
    'match'    => '/api/admin',
    'name'     => 'admin',
    'rootUrl'  => 'https://admin.aplication.com',
    'absolute' => true,
    'path'     => 'resources/routes',
  ],
]

功能

  • 模块化路由:根据 URL 模式(例如,/api、/admin、/user)定义和分离路由,每个模块生成一个单独的 JSON 文件。
  • 无缝集成 Laravel:自动从您的 Laravel 路由生成 JavaScript 路由,确保应用程序的一致性。
  • TypeScript 支持:包含一个与 TypeScript 兼容的 JavaScript 文件,允许您在前端代码中使用强类型路由定义。
  • 可定制 URL:生成具有可定制前缀和根 URL 的绝对或相对 URL,让您完全控制 URL 的构建方式。
  • 灵活配置:轻松配置模块和路由匹配条件以适应您项目的需求,无论是单体应用还是模块化应用。

许可证

此库采用 MIT 许可证授权。有关更多信息,请参阅 许可证 文件。