wapmorgan/openapi-generator

从PHP代码(PhpDoc、函数签名和类型提示)和项目(适用于yii2、slim、laravel)直接生成OpenApi配置。可用于维护大型单体后端的大型API文档。

0.4.9 2024-04-19 22:31 UTC

README

这是一个与原始源代码 + phpdoc一起工作的OpenApi配置生成器。

Latest Stable Version Latest Unstable Version License

此库的主要目的是自动化生成具有许多方法的现有JSON-API的OpenApi规范。想法来自@maxonrock

  1. Open Api生成器
  2. 扩展

OpenApiGenerator

它做什么?

它直接从源代码生成用于您用PHP编写的基于REST JSON的API的OpenApi 3.0规范文件。您不需要手动编写OpenApi规范。

Laravel示例

  1. 路由

    Route::get('/selector/lists', [\App\Http\Controllers\SelectorController::class, 'lists']);
    Route::post('/selector/select', [\App\Http\Controllers\SelectorController::class, 'select']);
    Route::get('/selector/goTo', [\App\Http\Controllers\SelectorController::class, 'goTo']);
    Route::get('/geo/detect', [\App\Http\Controllers\GeoController::class, 'detect']);
    Route::get('/geo/select', [\App\Http\Controllers\GeoController::class, 'select']);
  2. 一个控制器

    /**
    * Returns lists of filters
    * @param Request $request
    * @return ListsResponse
    */
    public function lists(Request $request) {
      return new ListsResponse([
          //            'persons' => range(1, 15),
          'persons' => array_keys(Menu::$personsList),
          'tastes' => Menu::$tastes,
          'meat' => Menu::$meat,
          'pizzas' => Menu::$pizzas,
      ]);
    }
    
    /**
    * Makes a selection of pizzas according to criteria
    * @param \App\Http\Requests\SelectPizzas $request
    * @return PizzaListItem[]
    */
    public function select(\App\Http\Requests\SelectPizzas $request) {
      $validated = $request->validated();
    
      return (new Selector())->select(
          $validated['city'], $validated['persons'],
          $validated['tastes'] ?? null, $validated['meat'] ?? null,
          $validated['vegetarian'] ?? false, $validated['maxPrice'] ?? null);
    }
  3. 一个请求和两个响应

    class SelectPizzas extends FormRequest {
         public function rules()
         { 
             // ...
             return array_merge([
                'city' => ['required', 'string'],
                'persons' => ['required', Rule::in(array_keys(Menu::$personsList))],
                'vegetarian' => ['boolean'],
                'maxPrice' => ['numeric'],
                'pizzas' => ['array', Rule::in(array_keys(Menu::$pizzas))],
             ], $tastes, $meat);
         } 
    }
    
    class ListsResponse extends BaseResponse {
         /** @var string[] */
         public $persons;
         /** @var string[] */
         public $tastes;
         /** @var string[] */
         public $meat;
         /** @var string[] */
         public $pizzas;
    }
    
    class PizzaListItem extends BaseResponse {
         public string $pizzeria;
         public string $id;
         public int $sizeId;
         public string $name;
         public float $size;
         public array $tastes;
         public array $meat;
         public float $price;
         public float $pizzaArea;
         public float $pizzaCmPrice;
         public string $thumbnail;
         public array $ingredients;
         public int $dough;
    }
  4. 从代码生成结果:具有描述和参数的