EasySwoole

注解控制器:安装与继承

普通控制器从 URL 找到 Action 后,由方法自己读取请求参数;AnnotationController 在此基础上读取 PHP 8 Attribute,按声明的来源提取参数、转换类型、执行校验,并可扫描生成接口文档。先读完普通控制器,再学习本章会更容易理解它增加了什么。

环境与组件

在应用项目根目录执行:

php -v
php --ri swoole
php --ri json
php --ri mbstring
php --ri dom
php --ri simplexml
php --ri libxml
composer show easyswoole/http-annotation

组件需要 PHP 8.1 及以上、JSON、mbstring、DOM、SimpleXML、libxml;如果当前项目没有安装,在项目根目录运行:

composer require 'easyswoole/http-annotation:^4.0'

EasySwoole 3.8 项目通常已通过框架依赖安装该组件,先用 composer show 确认,已有就不必重复安装。检查其他扩展时同样使用 php --ri 扩展名。

创建第一个注解控制器

新建 App/HttpController/HelloAnnotation.php:

<?php

namespace App\HttpController;

use EasySwoole\HttpAnnotation\AnnotationController;
use EasySwoole\HttpAnnotation\Attributes\Api;
use EasySwoole\HttpAnnotation\Attributes\ApiGroup;
use EasySwoole\HttpAnnotation\Enum\HttpMethod;

#[ApiGroup(groupName: 'Hello', description: '第一个注解接口')]
class HelloAnnotation extends AnnotationController
{
    #[Api(allowMethod: HttpMethod::GET, description: '返回问候语')]
    public function index(): void
    {
        $this->writeJson(200, ['message' => 'Hello Annotation']);
    }
}

文件路径、namespace App\HttpController 和类名要一致。服务尚未启动时执行 php easyswoole.php server start;已启动则执行 php easyswoole.php server reload。然后测试:

curl -i http://127.0.0.1:9501/helloAnnotation

默认控制器映射会进入 HelloAnnotation::index()。这里的 #[ApiGroup] 为文档定义分组,#[Api] 声明该接口只接受 GET。注解不会自动创建 URL 路由;显式路由仍需在 App/HttpController/Router.php 定义。现有 Controller 子类不能同时 extends Controller, AnnotationController;要启用 Attribute 处理,只需把基类改为 AnnotationController,它本身继承普通 Controller。

后续按Attribute 清单与定义参数 → 控制器组与接口定义 → 接口参数与传参 → onRequest 公共参数与继承 → 参数验证 → 生成接口文档阅读。

源码依据