Skip to content

枚举路由

Pin 用 PHP Enum 表达路由。每个 case 的值包含 HTTP 方法、URI 和可选路由名:

php
case Create = 'POST:/api/users';
case Login = 'POST:/auth/login|auth.login';

定义路由枚举

php
namespace App\Routes\User;

use App\Modules\User\Actions\ListUsersAction;
use Illuminate\Http\Request;
use Pin\Route\Attributes\Action;
use Pin\Route\Attributes\Middleware;
use Pin\Route\Attributes\Name;
use Pin\Route\InteractsWithRoute;
use Pin\Route\Routable;

enum UserRoute: string implements Routable
{
    use InteractsWithRoute;

    #[Name('user.index')]
    #[Action(ListUsersAction::class)]
    case Index = 'GET:/api/users';

    #[Middleware(\Illuminate\Foundation\Http\Middleware\TrimStrings::class)]
    case Create = 'POST:/api/users';

    case Update = 'PUT:/api/users/{id}';

    public static function registerRoutes(): void
    {
        foreach (self::cases() as $route) {
            $route->register($route->handler());
        }
    }
}

如果枚举使用 InteractsWithRoute,默认 registerRoutes() 已经会遍历全部 case 并调用 register()

路由值格式

格式结果
GET:/api/users方法 GET,URI /api/users,名称自动推导为 users
POST:/api/users名称自动推导为 users.create
PUT:/api/users/{id}名称自动推导为 users.update
DELETE:/api/users/{id}名称自动推导为 users.delete
`POST:/auth/loginauth.login`

也可以使用 #[Name('user.index')] 覆盖自动推导。

注册路由

单个路由:

php
UserRoute::Create->register([UserController::class, 'create']);

批量注册:

php
use Pin\Route\RouteRegistrar;

RouteRegistrar::register([
    App\Routes\User\UserRoute::class,
    App\Routes\Order\OrderRoute::class,
]);

Attribute

Attribute说明
#[Name('name')]覆盖路由名
#[Title('用户列表')]给路由声明标题,常用于菜单或测试报告
#[Middleware(...)]给 case 声明额外中间件
#[Action(...)]指定 Route Testing 默认 Action
#[AssertionMethod(...)]指定测试断言方式
#[Access(...)]覆盖或关闭权限码

#[Access(false)] 会跳过权限中间件。未传权限码时,如果 auth.access.enabled 为真,会使用 config('auth.access.middleware')

生成 URL

php
$url = UserRoute::Update->route(['id' => 1]);
$path = UserRoute::Update->route(['id' => 1], absolute: false);

底层使用 Laravel 的 route(),路由名来自 RouteDefinition

路由注册索引

每次 register() 成功后,RouteRegistry 会绑定枚举 case 和 Laravel Route:

php
use Pin\Route\RouteRegistry;

$items = RouteRegistry::items();

这对菜单生成、测试报告和权限列表很有用。

路由扫描

Pin\Route\RouteScanner 会按 PSR-4 路径扫描 *Route.php,并过滤实现 Routable 的枚举:

php
$routes = app(Pin\Route\RouteScanner::class)->scan([
    app_path('Routes'),
]);

扫描结果是一组可交给 RouteRegistrar::register() 的枚举类名。