eyf/laravel-autoroute

Laravel YAML 路由


README

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

"La route? Là où on va, on a pas besoin... De route."

安装

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) 来自定义简写语法。