eightyfive/laravel-autoroute

此包已被废弃,不再维护。作者建议使用eyf/laravel-autoroute包。

Laravel YAML 路由


README

Autoroute 帮助您将 Laravel 路由注册为 YAML。

"路由?去哪,不用... 路由。"

安装

composer require eyf/laravel-autoroute

使用方法

<?php
// app/Providers/RouteServiceProvider.php

use Eyf\Autoroute\Autoroute;

class RouteServiceProvider extends ServiceProvider
{
    public function map(Autoroute $autoroute)
    {
        $autoroute->load(["api.yaml"]);
    }
}

注意:它将自动查找 Laravel routes/ 文件夹内的文件。

示例 api.yaml

domain: api.example.org
prefix: v1
middleware:
    - api
namespace: App\Http\Controllers\Api
paths:
    "users":
        get:
            uses: UserController@index

        post:
            uses: UserController@store

    "users/{id}":
        get:
            uses: UserController@find

        put:
            uses: UserController@update

或者使用 紧凑语法

domain: api.example.org
prefix: v1
middleware:
    - api
namespace: App\Http\Controllers\Api
paths:
    "users":
        get: user.index
        post: user.store

    "users/{id}":
        get: user.find
        put: user.update

模板参数

Autoroute 支持 YAML 文件中的轻量级参数。格式为 %<parameter_name>%

例如,假设您需要处理本地 API 子域名

<?php
// app/Providers/RouteServiceProvider.php

use Eyf\Autoroute\Autoroute;

class RouteServiceProvider extends ServiceProvider
{
    public function map(Autoroute $autoroute)
    {
        $parameters = [
            "app_domain" => env("APP_DOMAIN", "example.org"),
        ];

        $autoroute->load(["api.yaml"], $parameters);
    }
}

在您的本地 .env 文件中

APP_DOMAIN=localhost:8000
# APP_DOMAIN=example.org # PROD

在您的 api.yaml 文件中

domain: api.%app_domain%
prefix: v1
# ...

默认路由名称

如果您在路由定义中没有提供 as 选项

"users/{id}":
    get:
      uses: UserController@find
        as: my_user_find_route_name

Autoroute 将基于当前命名空间、控制器和操作名称生成默认路由名称

"users/{id}":
    get:
        uses: UserController@find
        # as: api.user.find (generated)

自定义默认路由名称

如果您对默认路由名称格式不满意,您可以实现自己的 Eyf\Autoroute\RouteNamerInterface 并在您的 Laravel 应用程序服务提供者中相应地绑定它

<?php
// app/Providers/AppServiceProvider.php

use Eyf\Autoroute\RouteNamerInterface;
use App\Services\MyRouteNamer;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(RouteNamerInterface::class, MyRouteNamer::class);
    }
}

uses 紧凑语法

如果您没有使用任何路由选项(如 as),您可以使用“紧凑”语法来指定您的控制器

domain: api.%app_domain%
prefix: v1
middleware:
    - api
namespace: App\Http\Controllers\Api
paths:
    "users":
        get: user.index
        post: user.store

    "users/{id}":
        get: user.find
        put: user.update

自定义紧凑语法

您可以通过实现 RouteNamerInterface::getUses(string $compact) 来自定义缩写语法。