Skip to content

路由 Routing

基于注解的路由系统,自动扫描控制器目录。

定义路由

php
// app/controller/UserController.php
namespace App\controller;

use Lychee\routing\Route;

class UserController
{
    #[Route('GET', '/users')]
    public function index()
    {
        return 'user list';
    }

    #[Route('GET', '/users/{id}')]
    public function show(int $id)
    {
        return "user {$id}";
    }

    #[Route('POST', '/users')]
    public function store()
    {
        return 'created';
    }
}

路由参数

php
#[Route('GET', '/users/{id}/posts/{postId}')]
public function post(int $id, int $postId)
{
    // $id, $postId 自动从 URL 注入
}

路由中间件

php
use Lychee\routing\Middleware;

#[Route('GET', '/admin')]
#[Middleware(AuthMiddleware::class)]
public function admin()
{
    // ...
}

中间件可标注在类上(对所有方法生效)或方法上(追加)。

挂载多个中间件

支持三种写法,效果相同:

php
// 写法一:数组形式(推荐)
#[Middleware([AuthMiddleware::class, LogMiddleware::class])]
class UserController {}

// 写法二:重复注解
#[Middleware(AuthMiddleware::class)]
#[Middleware(LogMiddleware::class)]
class UserController {}

// 写法三:单个
#[Middleware(AuthMiddleware::class)]
class UserController {}

排除中间件

当类标注了中间件,个别方法(如登录、注册)无需鉴权时, 可在方法上使用 #[WithoutMiddleware] 排除类级中间件:

php
use Lychee\routing\Middleware;
use Lychee\routing\WithoutMiddleware;

#[Middleware([AuthMiddleware::class, LogMiddleware::class])]
class UserController
{
    // 排除所有类级中间件
    #[WithoutMiddleware]
    public function login() {}

    // 排除指定的一个中间件
    #[WithoutMiddleware(AuthMiddleware::class)]
    public function register() {}

    // 排除指定的多个中间件
    #[WithoutMiddleware([AuthMiddleware::class, LogMiddleware::class])]
    public function guest() {}

    // 继承类级中间件,需要鉴权
    public function index() {}
}

资源路由

标注 #[Resource] 的控制器会自动注册资源动作路由,无需再为每个方法声明 #[Route]。 仅当方法存在且为 public 时才会注册。

方法路由说明
index()GET /path列表
save()POST /path新建
read($id)GET /path/{id}详情
update($id)PUT /path/{id}(同时支持 PATCH更新
delete($id)DELETE /path/{id}删除单条
batch_delete()DELETE /path批量删除
php
use Lychee\routing\Resource;

#[Resource('/users')]
class UserController
{
    public function index() {}           // GET    /users
    public function save() {}            // POST   /users
    public function read($id) {}         // GET    /users/{id}
    public function update($id) {}       // PUT    /users/{id}
    public function delete($id) {}       // DELETE /users/{id}
    public function batch_delete() {}    // DELETE /users
}

若某个资源方法已显式声明 #[Route],则以显式声明为准,自动注册会跳过该方法。 #[Resource] 同样作为路径前缀作用于控制器内所有显式 #[Route] 方法。

如需零代码实现增删改查,可结合 控制器 / ResourceController 使用, 继承 ResourceController 并声明 $model 即可自动获得完整 CRUD 接口。

Released under the MIT License.