PHP code example of tangwei / apidocs

1. Go to this page and download the library: Download tangwei/apidocs library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

tangwei / apidocs example snippets



// config/autoload/api_docs.php
return [
    // 启用文档服务(建议生产环境禁用)
    'enable' => env('APP_ENV') !== 'prod',
    
    // 文档访问路径
    'prefix_url' => env('API_DOCS_PREFIX_URL', '/swagger'),
    
    // 基础信息
    'swagger' => [
        'info' => [
            'title' => 'API 文档',
            'version' => '1.0.0',
            'description' => '项目 API 文档',
        ],
        'servers' => [
            [
                'url' => 'http://127.0.0.1:9501',
                'description' => 'API 服务器',
            ],
        ],
    ],
];

use Hyperf\ApiDocs\DTO\GlobalResponse;
use function Hyperf\Support\env;

return [
    /*
    |--------------------------------------------------------------------------
    | 启动 swagger 服务
    |--------------------------------------------------------------------------
    |
    | false 将不会启动 swagger 服务
    |
    */
    'enable' => env('APP_ENV') !== 'prod',

    /*
    |--------------------------------------------------------------------------
    | 生成swagger文件格式
    |--------------------------------------------------------------------------
    |
    | 支持json和yaml
    |
    */
    'format' => 'json',

    /*
    |--------------------------------------------------------------------------
    | 生成swagger文件路径
    |--------------------------------------------------------------------------
    */
    'output_dir' => BASE_PATH . '/runtime/container',

    /*
    |--------------------------------------------------------------------------
    | 生成代理类路径
    |--------------------------------------------------------------------------
    */
    'proxy_dir' => BASE_PATH . '/runtime/container/proxy',

    /*
    |--------------------------------------------------------------------------
    | 设置路由前缀
    |--------------------------------------------------------------------------
    */
    'prefix_url' => env('API_DOCS_PREFIX_URL', '/swagger'),

    /*
    |--------------------------------------------------------------------------
    | 设置swagger资源路径,cdn资源
    |--------------------------------------------------------------------------
    */
    'prefix_swagger_resources' => 'https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/5.5.0',

    /*
    |--------------------------------------------------------------------------
    | 设置全局返回的代理类
    |--------------------------------------------------------------------------
    |
    | 全局返回 如:[code=>200,data=>null] 格式,设置会后会全局生成对应文档
    | 配合ApiVariable注解使用,示例参考GlobalResponse类
    | 返回数据格式可以利用AOP统一返回
    |
    */
    // 'global_return_responses_class' => GlobalResponse::class,

    /*
    |--------------------------------------------------------------------------
    | 替换验证属性
    |--------------------------------------------------------------------------
    |
    | 通过获取注解ApiModelProperty的值,来提供数据验证的提示信息
    |
    */
    'validation_custom_attributes' => true,

    /*
    |--------------------------------------------------------------------------
    | 设置DTO类默认值等级
    |--------------------------------------------------------------------------
    |
    | 设置:0 默认(不设置默认值)
    | 设置:1 简单类型会为设置默认值,复杂类型(带?)会设置null
    |        - 简单类型默认值: int:0  float:0  string:''  bool:false  array:[]  mixed:null
    | 设置:2 (慎用)包含等级1且复杂类型(联合类型除外)会设置null
    |
    */
    'dto_default_value_level' => 0,

    /*
    |--------------------------------------------------------------------------
    | 全局responses,映射到ApiResponse注解对象
    |--------------------------------------------------------------------------
    */
    'responses' => [
        ['response' => 401, 'description' => 'Unauthorized'],
        ['response' => 500, 'description' => 'System error'],
    ],
    /*
    |--------------------------------------------------------------------------
    | swagger 的基础配置
    |--------------------------------------------------------------------------
    |
    | 该属性会映射到OpenAPI对象
    |
    */
    'swagger' => [
        'info' => [
            'title' => 'API DOC',
            'version' => '0.1',
            'description' => 'swagger api desc',
        ],
        'servers' => [
            [
                'url' => 'http://127.0.0.1:9501',
                'description' => 'OpenApi host',
            ],
        ],
        'components' => [
            'securitySchemes' => [
                [
                    'securityScheme' => 'Authorization',
                    'type' => 'apiKey',
                    'in' => 'header',
                    'name' => 'Authorization',
                ],
            ],
        ],
        'security' => [
            ['Authorization' => []],
        ],
        'externalDocs' => [
            'description' => 'Find out more about Swagger',
            'url' => 'https://github.com/tw2066/api-docs',
        ],
    ],
];



namespace App\Request;

use Hyperf\ApiDocs\Annotation\ApiModelProperty;
use Hyperf\DTO\Annotation\Validation\Required;
use Hyperf\DTO\Annotation\Validation\Integer;
use Hyperf\DTO\Annotation\Validation\Between;

class UserRequest
{
    #[ApiModelProperty('用户名')]
    #[Required]
    public string $username;

    #[ApiModelProperty('年龄')]
    #[Required]
    #[Integer]
    #[Between(1, 120)]
    public int $age;

    #[ApiModelProperty('邮箱')]
    public ?string $email = null;
}



namespace App\Controller;

use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;
use Hyperf\HttpServer\Annotation\PostMapping;
use Hyperf\ApiDocs\Annotation\Api;
use Hyperf\ApiDocs\Annotation\ApiOperation;
use Hyperf\DTO\Annotation\Contracts\RequestBody;
use Hyperf\DTO\Annotation\Contracts\RequestQuery;
use Hyperf\DTO\Annotation\Contracts\Valid;
use App\Request\UserRequest;

#[Controller(prefix: '/user')]
#[Api(tags: '用户管理', position: 1)]
class UserController
{
    #[GetMapping(path: 'list')]
    #[ApiOperation(summary: '获取用户列表')]
    public function list(#[RequestQuery] #[Valid] UserRequest $request): array
    {
        return [
            ['id' => 1, 'username' => 'admin'],
            ['id' => 2, 'username' => 'user'],
        ];
    }

    #[PostMapping(path: 'create')]
    #[ApiOperation(summary: '创建用户')]
    public function create(#[RequestBody] #[Valid] UserRequest $request): array
    {
        return [
            'id' => 1,
            'username' => $request->username,
            'age' => $request->age,
        ];
    }
}

#[Api(
    tags: '用户管理',         // 标签名称(支持数组)
    description: '用户相关操作', // 描述
    position: 1,             // 排序位置
    hidden: false           // 是否隐藏
)]

#[ApiOperation(
    summary: '创建用户',       // 摘要
    description: '详细描述',   // 详细描述
    deprecated: false,        // 是否废弃
    security: true,          // 是否需要认证
    hidden: false           // 是否隐藏
)]

// 简单类型响应
#[ApiResponse(PhpType::INT, 200, '成功')]

// 对象响应
#[ApiResponse(UserResponse::class, 200, '用户信息')]

// 数组响应
#[ApiResponse([UserResponse::class], 200, '用户列表')]

// 分页响应
#[ApiResponse(new Page([UserResponse::class]), 200, '分页数据')]

use Hyperf\ApiDocs\Annotation\ApiVariable;

class Page
{
    public int $total;

    #[ApiVariable]
    public array $content;

    public function __construct(array $content, int $total = 0)
    {
        $this->content = $content;
        $this->total = $total;
    }
}

#[ApiOperation('分页查询')]
#[GetMapping(path: 'page')]
#[ApiResponse(new Page([UserResponse::class]))]
public function page(#[RequestQuery] PageQuery $query): Page
{
    // 返回分页数据
}

public function create(#[RequestBody] #[Valid] UserRequest $request)
{
    // $request 自动填充 body 数据
}

public function list(#[RequestQuery] #[Valid] QueryRequest $request)
{
    // $request 自动填充查询参数
}

#[ApiFormData(name: 'photo', format: 'binary')]
public function upload(#[RequestFormData] UploadRequest $formData)
{
    $file = $this->request->file('photo');
    // 处理文件上传
}

public function auth(#[RequestHeader] #[Valid] AuthHeader $header)
{
    // $header 自动填充请求头数据
}

#[ApiModelProperty(
    value: '用户名',        // 属性描述
    example: 'admin',      // 示例值
    

// 全局请求头(类级别)
#[ApiHeader('X-Request-Id')]

// 方法级请求头
#[ApiHeader(
    name: 'Authorization',
    

// 使用默认认证
#[ApiSecurity('Authorization')]

// 方法级覆盖
#[ApiOperation(summary: '登录', security: false)]  // 不需要认证

use Hyperf\DTO\Annotation\Validation\*;

class UserRequest
{
    #[Required]                        // 必填
    #[Max(50)]                         // 最大长度
    public string $username;

    #[Required]
    #[Integer]                         // 整数
    #[Between(1, 120)]                 // 范围
    public int $age;

    #[Email]                           // 邮箱格式
    public ?string $email;

    #[Url]                             // URL 格式
    public ?string $website;

    #[Regex('/^1[3-9]\d{9}$/')]       // 正则验证
    public ?string $mobile;

    #[In(['male', 'female'])]          // 枚举值
    public ?string $gender;

    #[Date]                            // 日期格式
    public ?string $birthday;
}

public function create(#[RequestBody] #[Valid] UserRequest $request)
{
    // 验证自动执行
}

// 支持 Laravel 风格的验证规则
#[Validation('idation('integer', customKey: 'ids.*')]
public array $ids;



namespace App\Validation;

use Attribute;
use Hyperf\DTO\Annotation\Validation\BaseValidation;

#[Attribute(Attribute::TARGET_PROPERTY)]
class Mobile extends BaseValidation
{
    protected $rule = 'regex:/^1[3-9]\d{9}$/';
    
    public function __construct(string $messages = '手机号格式错误')
    {
        parent::__construct($messages);
    }
}

use App\Validation\Mobile;

class RegisterRequest
{
    #[Required]
    #[Mobile]
    public string $phone;
}

/**
 * @var Address[]
 */
#[ApiModelProperty('地址列表')]
public array $addresses;

/**
 * @var int[]
 */
#[ApiModelProperty('ID 列表')]
public array $ids;

use Hyperf\DTO\Annotation\ArrayType;

#[ApiModelProperty('地址列表')]
#[ArrayType(Address::class)]
public array $addresses;

#[ApiModelProperty('标签列表')]
#[ArrayType('string')]
public array $tags;

class UserRequest
{
    public string $name;
    
    // 嵌套对象
    #[ApiModelProperty('地址信息')]
    public Address $address;
    
    /**
     * @var Address[]
     */
    #[ApiModelProperty('多个地址')]
    public array $addresses;
}

class Address
{
    public string $province;
    public string $city;
    public string $street;
}

use Hyperf\DTO\Type\PhpType;

enum StatusEnum: int
{
    case PENDING = 0;
    case ACTIVE = 1;
    case INACTIVE = 2;
}

class OrderRequest
{
    #[ApiModelProperty('订单状态')]
    public StatusEnum $status;
}

// config/autoload/api_docs.php
return [
    'global_return_responses_class' => \App\DTO\GlobalResponse::class,
];



namespace App\DTO;

use Hyperf\ApiDocs\Annotation\ApiModelProperty;
use Hyperf\ApiDocs\Annotation\ApiVariable;

class GlobalResponse
{
    #[ApiModelProperty('状态码')]
    public int $code = 0;

    #[ApiModelProperty('消息')]
    public string $message = 'success';

    #[ApiVariable]
    #[ApiModelProperty('响应数据')]
    public mixed $data = null;
}

#[PostMapping(path: 'upload')]
#[ApiOperation(summary: '文件上传')]
#[ApiFormData(name: 'file', format: 'binary', 
{
    $file = $this->request->file('file');
    // 处理文件上传
    return ['url' => '/uploads/file.jpg'];
}

use Hyperf\DTO\Annotation\Dto;

#[Dto]
class DemoQuery
{
}

use Hyperf\DTO\Annotation\Dto;
use Hyperf\DTO\Annotation\JSONField;

#[Dto]
class DemoQuery
{
    #[ApiModelProperty('这是一个别名')]
    #[JSONField('alias_name')]
    #[Required]
    public string $name;
}

return [
    \Hyperf\DTO\Aspect\ObjectNormalizerAspect::class
]

use Hyperf\Serializer\SerializerFactory;
use Hyperf\Serializer\Serializer;

return [
    Hyperf\Contract\NormalizerInterface::class => new SerializerFactory(Serializer::class),
];

/**
 * @var User[]
 */
public array $users;

// 或
#[ArrayType(User::class)]
public array $users;

#[Api(hidden: true)]  // 隐藏整个控制器

#[ApiOperation(summary: '测试', hidden: true)]  // 隐藏单个接口

#[ApiResponse(UserResponse::class, 200, '成功')]
public function getUser(): UserResponse
{
    return new UserResponse();
}
bash
php bin/hyperf.php vendor:publish tangwei/apidocs
bash
php bin/hyperf.php start