api文檔+路由自動(dòng)注冊

webman-tech/swagger
swagger openapi 在 webman 中一鍵配置啟用
安裝
composer require webman-tech/swagger
特點(diǎn)
- 基于 zircote/swagger-php(同時(shí)支持 Annotation 和 Attribute 模式)
- 支持零配置啟動(dòng)(安裝后直接訪問 /openapi 即可看到 swagger UI 的界面)
- 支持單應(yīng)用下多個(gè) swagger 文檔(多路由,不同 api 文檔)
- 支持動(dòng)態(tài)修改注解下的 swagger 文檔(解決注解下無法寫動(dòng)態(tài)配置的問題)
- 支持豐富的配置(host 訪問限制 / swagger-ui 配置 / openapi 配置)
- 性能優(yōu)先(服務(wù)啟動(dòng)后緩存,開發(fā)環(huán)境支持自動(dòng)更新)
- 支持自動(dòng)注冊 webman 路由(已經(jīng)寫了 openapi 文檔,再寫一遍 webman Route 是不是多此一舉?)
使用
零配置
安裝完依賴后打開 /openapi
即可訪問 swagger 文檔
默認(rèn)掃描整個(gè) app_path()
之后在 Controller 寫對應(yīng)的注解即可,參考 zircote/swagger-php petstore.swagger.io
修改 @OA\Info 等全局的配置
第一種:通過添加注釋的方式修改
<?php
namespace app\swagger;
use OpenApi\Annotations as OA;
/**
* @link https://swagger.io/specification/#info-object
* @OA\OpenApi(
* @OA\Info(version="1.0.0", title="My App"),
* @OA\Server(url="/api", description="localhost"),
* )
*/
class OpenapiSpec
{
}
第二種:通過 modify 的方式修改(建議:因?yàn)檫@種方式支持更加復(fù)雜和動(dòng)態(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)境下
默認(rèn) host_forbidden
開啟,僅內(nèi)網(wǎng)環(huán)境下可訪問,見 HostForbiddenMiddleware
可以通過配置 app.php
中的 host_forbidden
enable => false
來全局關(guān)閉
多應(yīng)用支持
默認(rèn)通過配置 app.php
中的 global_route
配置會(huì)啟用全局的掃描 app_path()
的文檔,
可以通過設(shè)置 enable => false
來關(guān)閉
在需要的地方通過 (new Swagger())->registerRoute()
來手動(dòng)注冊文檔路由
如:
<?php
use Webman\Route;
use WebmanTech\Swagger\Swagger;
Route::group('/api1', function () {
(new Swagger())->registerRoute([
'route_prefix' => '/openapi',
'openapi_doc' => [
'scan_path' => app_path() . '/controller/api1',
],
]);
Route::get('/test', [\app\controller\Test::class, 'index']);
});
Route::group('/api2', function () {
(new Swagger())->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)用級別(僅當(dāng)前應(yīng)用生效)
app.php
中的配置是全局的
(new Swagger())->registerRoute($config)
中的傳參 $config
是應(yīng)用級別的
webman 路由自動(dòng)注冊
在 config 的 app.php
中修改 register_webman_route
為 true 即可自動(dòng)注冊 webman 路由