配置文件路由

配置文件路由是在 config/route/route.php 中通过 Router 门面手动注册路由的方式。适合需要集中管控路由定义的场景。

基础用法

注册路由

php
// config/route/route.php
use Viswoole\Router\Facade\Router;

// GET 请求
Router::get('/user/list', [UserController::class, 'list']);

// POST 请求
Router::post('/user/create', [UserController::class, 'create']);

// PUT 请求
Router::put('/user/update', [UserController::class, 'update']);

// DELETE 请求
Router::delete('/user/delete', [UserController::class, 'delete']);

// 支持多种 HTTP 方法
Router::patch('/user/patch', [UserController::class, 'patch']);
Router::options('/user/options', [UserController::class, 'options']);

闭包处理器

路由处理器可以是闭包,适用于轻量级逻辑:

php
Router::get('/ping', function () {
    return ['code' => 0, 'message' => 'pong'];
});

// 支持依赖注入
Router::get('/time', function (Request $request) {
    return ['timestamp' => time(), 'path' => $request->path()];
});

多方法注册

使用 any 一次性注册匹配所有 HTTP 方法:

php
// 匹配所有方法
Router::any('/user/all', [UserController::class, 'handleAll']);

动态参数

必选参数

路径中使用 {参数名} 声明必选参数:

php
Router::get('/user/{id}', [UserController::class, 'detail']);
// /user/1024  →  $id = 1024
// /user/      →  404(缺少必选参数)

通过 patterns 约束参数格式:

php
Router::get('/user/{id}', [UserController::class, 'detail'])
    ->patterns(['id' => '\d+']); // id 必须为数字

可选参数

使用 {参数名?} 声明可选参数,默认值由控制器方法参数默认值决定:

php
Router::get('/user/{id?}', [UserController::class, 'detail']);

// 控制器中指定默认值
public function detail(int $id = 0): array {}
// /user/      →  $id = 0
// /user/1024  →  $id = 1024

多参数组合

php
Router::get('/article/{category}/{id}', [ArticleController::class, 'show'])
    ->patterns([
        'category' => '[a-z]+',
        'id'       => '\d+',
    ]);

// /article/php/42  →  $category = 'php', $id = 42

路由属性

设置中间件

php
Router::get('/admin/dashboard', [AdminController::class, 'dashboard'])
    ->setMiddlewares([AuthMiddleware::class, AdminMiddleware::class]);

设置域名限制

php
Router::get('/api/version', [ApiController::class, 'version'])
    ->setDomain('api.example.com');

设置后缀

php
Router::get('/about', [PageController::class, 'about'])
    ->setSuffix('html');
// 访问 /about.html 才能匹配

未命中路由(Miss)

当所有路由均未匹配时,执行 miss 回调(仅接受闭包):

php
Router::miss(function () {
    return ['code' => 404, 'message' => 'Not Found'];
});

// 如需调用控制器方法,在闭包中转发
Router::miss(function () {
    return ErrorController::notFound();
});

完整示例

php
<?php
// config/route/route.php
use App\Controller\UserController;
use App\Middleware\AuthMiddleware;
use Viswoole\Router\Facade\Router;

// 用户模块 - 带认证中间件
Router::group('/api/v1/user', function () {

    Router::get('/info', [UserController::class, 'info'])
        ->setMiddlewares([AuthMiddleware::class]);

    Router::post('/create', [UserController::class, 'create'])
        ->setMiddlewares([AuthMiddleware::class]);

    Router::get('/{id}', [UserController::class, 'detail'])
        ->patterns(['id' => '\d+']);

}, 'api.v1.user')->setMiddlewares([RateLimitMiddleware::class]);

// 首页
Router::get('/', [HomeController::class, 'index']);

// 404 兜底
Router::miss(function () {
    return ['code' => 404, 'message' => '页面不存在'];
});