fillincode/swagger

用于生成 OpenApi 文档的包

1.0.1 2024-09-09 13:58 UTC

This package is auto-updated.

Last update: 2024-09-09 13:59:00 UTC


README

安装

composer require fillincode/swagger

发布配置

php artisan vendor:publish --provider="Fillincode\Swagger\SwaggerServiceProvider"

配置

OpenApi 版本

'openapi' => '3.0.0',

使用信息配置你的 Api。你可以定义标题、描述、版本、使用条款、联系信息和许可证

'info' => [
    'title' => 'API documentation',
    'description' => 'API documentation',
    'version' => '1.0.0',
    'termsOfService' => 'https://example.com/terms',
    'contact' => [
        'name' => 'example',
        'url' => 'https://example.com',
        'email' => 'example@mail.ru',
    ],
    'license' => [
        'name' => 'CC Attribution-ShareAlike 4.0 (CC BY-SA 4.0)',
        'url' => 'https://openweathermap.org/price',
    ],
],

现成的授权方案

'securitySchemes' => [
    'passport' => [
        'type' => 'http',
        'in' => 'header',
        'name' => 'Authorization',
        'scheme' => 'Bearer',
        'description' => 'To authorize, use the key ',
    ],
    'sanctum' => [
        'type' => 'http',
        'in' => 'header',
        'name' => 'Authorization',
        'scheme' => 'Bearer',
        'description' => 'To authorize, use the key ',
    ],
],

关于请求将发送到的服务器的信息

'servers' => [
    [
        'url' => env('APP_URL'),
        'description' => 'Server for testing',
    ],

服务器授权配置

  1. 需要确定是否有需要授权的请求
  2. 检查授权的中间件
  3. 选择所需的授权方案
  4. 你需要定义一个函数或可调用的类,它将返回授权令牌(s)。你可以返回一个包含令牌描述和值的数组,或者只是一个字符串令牌

此类的一个示例

    public function __invoke(): string|array
    {
        $user = User::whereEmail('user@mail.ru')->first();

        return $user?->createToken('user-token')->accessToken;
    }

    ````

    public function __invoke(): string|array
    {
        $user = User::whereEmail('user@mail.ru')->first();
        $admin = User::whereEmail('admin@mail.ru')->first();

        return [
            'user' => $user?->createToken('user-token')->accessToken,
            'admin' => $admin?->createToken('admin-token')->accessToken
        ];
    }

授权配置

'auth' => [
    'has_auth' => true,
    'middleware' => 'auth.api',
    'security_schema' => 'passport',
    'make_token' => [
        'action' => 'makeTokenFunction',
    ],
],

存储测试结果的临时文件的配置。可以确定驱动器和路径

'storage' => [
    'driver' => 'local',
    'path' => 'data',
],

资源键配置

'pre_key' => 'data',

'resources_keys' => [
    'has_pre_key' => false,
    'use_wrap' => true,
],

资源键配置设置的示例

例如,如果有不属于资源的附加键,资源有键,但不是通过 wrap 设置的

响应

'data' => [
    'user' => [
        'id' => 12,
        'name' => 'user_name'
    ]
]

资源

    class UserResource extends JsonResource

    public function toArray(Request $request)
    {
        return [
            'user' => [
                'id' => $this->id,
                'name' => $this->name
            ]           
        ]       
    }

配置

'pre_key' => 'data',

'resources_keys' => [
    'has_pre_key' => true,
    'use_wrap' => false,
],

如果没有附加键在响应中,并且资源使用 wrap 属性作为键

响应

'user' => [
    'id' => 12,
    'name' => 'user_name'
]

资源

    class UserResource extends JsonResource

    public static $wrap = 'user';
    
    public function toArray(Request $request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name        
        ]       
    }

配置

'pre_key' => '',

'resources_keys' => [
    'has_pre_key' => true,
    'use_wrap' => true,
],

如果响应只包含数据,没有任何键

响应

[
    'id' => 12,
    'name' => 'user_name'
]

资源

    class UserResource extends JsonResource
    
    public function toArray(Request $request)
    {
        return [
            'id' => $this->id,
            'name' => $this->name        
        ]       
    }

    public function boot(): void
    {
        JsonResource::withoutWrapping();
    }

配置

'pre_key' => '',

'resources_keys' => [
    'has_pre_key' => false,
    'use_wrap' => false,
],

预定义的响应代码描述。你可以将你自己的响应描述添加到这个数组中

'codes' => [
    200 => 'Request completed successfully',
    201 => 'Object created successfully',
    204 => 'Not content',
    401 => 'Not authentication',
    403 => 'Not authorization',
    404 => 'Not found',
    422 => 'Data validation error',
    500 => 'Server error',
],

命令

清除测试结果目录

php artisan swagger:destroy

从所有测试结果文件生成文档文件

php artisan swagger:parse

运行测试,生成新文档并删除临时文件

php artisan swagger:generate

属性

该属性用于对路由进行分组

适用

  1. 控制器方法

该参数接受

  1. 组名(字符串)。必需

示例

    use Fillincode\Swagger\Attributes\Group;
    
    #[Group('group_name')]
    public function example_method()
    {
        //
    }

摘要

路由的简要描述

适用

  1. 控制器方法

该参数接受

  1. 摘要(字符串)。必需

示例

    use Fillincode\Swagger\Attributes\Summary;
     
    #[Summary('summary')]
    public function example_method()
    {
        //
    }

描述

路由的详细描述

适用

  1. 控制器方法

该参数接受

  1. 描述(字符串)。必需

示例

    use Fillincode\Swagger\Attributes\Description;
     
    #[Description('description')]
    public function example_method()
    {
        //
    }

代码

该属性需要用于自定义代码描述

适用

  1. 控制器方法

该参数接受

  1. 代码(整数)。必需
  2. 代码描述(字符串)。必需

示例

    use Fillincode\Swagger\Attributes\Code;
     
    #[Code(201, 'Object update')]
    public function example_method()
    {
        //
    }

PathParameter

该属性需要用于描述通过地址栏传递的参数

适用

  1. 控制器方法

该参数接受

  1. 参数名称(字符串)。必需
  2. 类型(字符串)。必需
  3. 描述(字符串)
  4. 可用值(字符串|数组)。该参数对于枚举类型是必需的
  5. 必需(布尔值)。参数是否必需。默认为 true

示例

    use Fillincode\Swagger\Attributes\PathParameter;
     
    #[PathParameter('parameter_name', 'enum', 'description parameter', ['string_1', 'string_2', 12], false)]
    public function example_method()
    {
        //
    }

QueryParameter

该属性需要用于描述通过 GET 参数传递的参数

适用

  1. 控制器方法

该参数接受

  1. 参数名称(字符串)。必需
  2. 类型(字符串)。必需
  3. 示例(字符串/整数/布尔值)。必需
  4. 描述(字符串)
  5. 可用值(字符串|数组)。该参数对于枚举类型是必需的
  6. 必需(布尔值)。参数是否必需。默认为 true

示例

    use Fillincode\Swagger\Attributes\QueryParameter;
     
    #[QueryParameter('parameter_name', 'string', 'example_string', 'description parameter')]
    public function example_method()
    {
        //
    }

资源

该属性用于指示响应中返回的资源。此资源将根据响应数据收集信息。要描述嵌套资源,必须在父资源上定义此属性

适用

  1. 控制器方法
  2. 资源类

该参数接受

  1. 类(字符串)。必需
  2. 名称(字符串|null)。此参数仅在资源对象具有键且与资源的 wrap 属性不同时需要
  3. use_wrap(布尔值|null)。如果资源使用 wrap 作为键,则需要传递 true(可以激活配置中的所有资源)
  4. has_key(布尔值|null)。如果资源有键,则需要传递 true(可以配置配置中的所有资源)

示例

    use Fillincode\Swagger\Attributes\Resource;
     
    #[Resource(ProjectResource::class)]
    public function example_method()
    {
        //
    }

    ```` 
    
    #[Resource(CategoryResource::class, 'categories')]
    class ExampleResource extends JsonResource
    {
        //
    }

FormRequest

此属性用于指示通过哪个FormRequest类收集数据来描述请求中传递的参数

适用

  1. 控制器方法

该参数接受

  1. 类(字符串)。必需

示例

    use Fillincode\Swagger\Attributes\FormRequest;
     
    #[FormRequest(FormRequest::class)]
    public function example_method()
    {
        //
    }

属性

该属性描述了请求中传递的参数或响应中返回的参数

适用

  1. FormRequest类
  2. 资源类

该参数接受

  1. 名称 (字符串)。 必需
  2. 类型(字符串)。必需
  3. 描述 (字符串)。
  4. 输入 (字符串|数组)。可用值,仅对枚举类型需要参数
  5. is_required (布尔值)。默认为true

示例

    use Fillincode\Swagger\Attributes\Property;
     
    #[Property('age', 'integer', 'student age')]
    class ProjectRequest extends FormRequest
    {
        //
    }

    ````
    #[Property('age', 'integer', 'student age')]
    class ProjectResource extends JsonResource
    {
        //
    }

此外

当资源有一个需要文档化键的数组时的一个示例

    use Fillincode\Swagger\Attributes\Property;
    
    #[Property('id', 'string', 'user id')]
    #[Property('data.info_1', 'string', 'user info 1')]
    #[Property('data.info_2', 'string', 'user info 2')]
    class UserResource extends JsonResource
    {
        public function toArray(Request $request)
        {
            return [
                'id' => $this->id,
                'data' => [
                    'info_1' => $this->data['info_1'],
                    'info_2' => $this->data['info_2'],
                ]       
            ]       
        }
    }