国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

Swagger api文檔+路由自動注冊

v2.1.1 版本
2025-07-31 版本更新時間
967 安裝
5 star

webman-tech/swagger

簡介

swagger openapi 在 webman 中一鍵配置啟用

安裝

composer require webman-tech/swagger

特點

  • 基于 zircote/swagger-php(支持 Attribute 模式)
  • 支持零配置啟動(安裝后直接訪問 /openapi 即可看到 swagger UI 的界面)
  • 支持單應(yīng)用下多個 swagger 文檔(多路由,不同 api 文檔)
  • 支持動態(tài)修改注解下的 swagger 文檔(解決注解下無法寫動態(tài)配置的問題)
  • 支持豐富的配置(host 訪問限制 / swagger-ui 配置 / openapi 配置)
  • 性能優(yōu)先(服務(wù)啟動后緩存,開發(fā)環(huán)境支持自動更新)
  • 支持自動注冊 webman 路由(已經(jīng)寫了 openapi 文檔,再寫一遍 webman Route 是不是多此一舉?)
  • 不僅僅支持 webman 環(huán)境(非一鍵啟動,需要調(diào)整配置)

使用

零配置

安裝完依賴后打開 /openapi 即可訪問 swagger 文檔

默認掃描整個 app_path()

修改 @OA\Info 等全局的配置

第一種:通過添加注釋的方式修改

<?php

namespace app\swagger;

use OpenApi\Attributes as OA;

/**
 * @link https://swagger.io/specification/#info-object
 */
#[OA\Info(version: '1.0.0', title: 'My App')]
#[OA\Server(url: '/api', description: 'localhost')]
class OpenapiSpec
{
}

第二種:通過 modify 的方式修改(建議:因為這種方式支持更加復(fù)雜和動態(tài)的配置)

以下 openapi_doc 支持配置在 全局 和 應(yīng)用級別(見 配置說明

use OpenApi\Annotations as OA;

'openapi_doc' => [
    'modify' => function(OA\OpenApi $openApi) {
        $openApi->info->title = 'My App';
        $openApi->info->version = '1.0.0';

        $openApi->servers = [
            new OA\Server(['url' => '/api', 'description' => 'localhost']),
        ];
    }
]

限制訪問

為了保證接口文檔的安全性,不應(yīng)該讓接口暴露在公網(wǎng)環(huán)境下

默認 host_forbidden 開啟,僅內(nèi)網(wǎng)環(huán)境下可訪問,見 HostForbiddenMiddleware

可以通過配置 app.php 中的 host_forbidden enable => false 來全局關(guān)閉

多應(yīng)用支持

默認通過配置 app.php 中的 global_route 配置會啟用全局的掃描 app_path() 的文檔,
可以通過設(shè)置 enable => false 來關(guān)閉

在需要的地方通過 Swagger::create()->registerRoute() 來手動注冊文檔路由

如:

<?php

use Webman\Route;
use WebmanTech\Swagger\Swagger;

Route::group('/api1', function () {
    Swagger::create()->registerRoute([
        'route_prefix' => '/openapi',
        'openapi_doc' => [
            'scan_path' => app_path() . '/controller/api1',
        ],
    ]);

    Route::get('/test', [\app\controller\Test::class, 'index']);
});

Route::group('/api2', function () {
    Swagger::create()->registerRoute([
        'route_prefix' => '/my-doc',
        'openapi_doc' => [
            'scan_path' => app_path() . '/controller/api2',
        ],
    ]);

    Route::get('/test', [\app\controller\Test::class, 'index']);
});

如此配置,支持通過 /api1/openapi 訪問 api1 的文檔,/api2/my-doc 訪問 api2 的文檔

配置說明

很多配置都支持全局(多應(yīng)用共享)、應(yīng)用級別(僅當前應(yīng)用生效)

app.php 中的配置是全局的

Swagger::create()->registerRoute($config) 中的傳參 $config 是應(yīng)用級別的

webman 路由自動注冊

在 config 的 app.php 中修改 register_route 為 true 即可自動注冊 webman 路由

路由傳參與 swagger 文檔綁定,并且支持自動校驗(僅支持 php>=8.1)

建立一個 Form(可同時用于 POST 和 GET,可以無需任何的 Swagger 注解,也能用)

<?php

namespace app\form;

use WebmanTech\DTO\Attributes\ValidationRules;
use WebmanTech\DTO\BaseRequestDTO;
use WebmanTech\DTO\BaseResponseDTO;

class TestForm extends BaseRequestDTO {
    /**
     * 名稱
     * @example webman
     */
    public string $name = '';
    /**
     * 年齡
     * @example 5 
     */
    #[ValidationRules(max: 100)]
    public int $age = 0;
    /**
     * 備注
     */
    public string $remark = '';

    public function doSomething(): TestFormResult {
        return new TestFormResult(
            name: 'abc',
        )
    }
}

class TestFormResult extends BaseResponseDTO {
    public function __construct(
        /**
         * 名稱
         */
        public string $name,
    ) {
    }
}

控制器


use app\form\TestForm;
use OpenApi\Attributes as OA;
use WebmanTech\Swagger\DTO\SchemaConstants;

class IndexController {
     #[OA\Post(
        path: '/xxx',
        summary: '接口說明',
        x: [
            SchemaConstants::X_SCHEMA_REQUEST => TestForm::class . '@doSomething'
        ],
    )]
    public function md(Request $request) {
        return TestForm::fromRequest($request)
            ->doSomething()
            ->toResponse();
    }

    #[OA\Get(
        path: '/xxx',
        summary: '接口說明',
        x: [
            SchemaConstants::X_SCHEMA_REQUEST => TestForm::class . '@doSomething'
        ],
    )]
    public function md(Request $request) {
        return TestForm::fromRequest($request)
            ->doSomething()
            ->toResponse();
    }
}

參考

webman 使用最佳實踐

webman 使用 swagger 示例:注解模式的 crud

webman 使用 swagger 示例:多 swagger 文檔

贊助商