Files
MrleeAdmin/.windsurf/skills/backend-route/SKILL.md
T

296 lines
8.9 KiB
Markdown
Raw Normal View History

2026-08-31 11:33:59 +08:00
---
name: backend-route
description: Generate route configuration for madong module. Supports both app (main project) and plugin targets. Creates route.php files for adminapi and api with proper OpenAPI scan paths.
---
# Generate Route
Create route configuration files for modules.
## File Location
**App (主项目):**
```
app/adminapi/config/route.php
app/api/config/route.php
```
**Plugin (插件):**
```
plugin/{plugin}/config/route.php
```
## AdminAPI Route Template
```php
<?php
declare(strict_types=1);
/**
*+------------------
* madong
*+------------------
* Copyright (c) https://gitee.com/motion-code All rights reserved.
*+------------------
* Author: Mr. April (405784684@qq.com)
*+------------------
*/
use Webman\Route;
use WebmanTech\Swagger\Swagger;
use OpenApi\Annotations as OA;
/**
* 注册admin API路由
*/
Route::group('/adminapi', function () {
Swagger::create()->registerRoute([
'route_prefix' => '/openapi',
'register_route' => true,
'openapi_doc' => [
'scan_path' => [
base_path('app/schema'), // 基础schema
base_path('app/adminapi'),
base_path('app/install'),
],
'modify' => function (OA\OpenApi $openapi) {
$openapi->info->title = config('app.name') . ' API';
$openapi->info->version = '1.0.0';
$openapi->servers = [
new OA\Server([
'url' => '/adminapi',
'description' => request()->host(),
]),
];
if (!$openapi->components instanceof OA\Components) {
$openapi->components = new OA\Components([]);
}
$openapi->components->securitySchemes = [
new OA\SecurityScheme([
'securityScheme' => 'api_key',
'type' => 'apiKey',
'name' => config('madong.jwt.app.token_name', 'Authorization'),
'in' => 'header',
]),
];
},
],
]);
});
```
## API Route Template
```php
<?php
declare(strict_types=1);
/**
*+------------------
* madong
*+------------------
* Copyright (c) https://gitee.com/motion-code All rights reserved.
*+------------------
* Author: Mr. April (405784684@qq.com)
*+------------------
*/
use Webman\Route;
use WebmanTech\Swagger\Swagger;
use OpenApi\Annotations as OA;
/**
* 注册API路由
*/
Route::group('/api', function () {
Swagger::create()->registerRoute([
'route_prefix' => '/openapi',
'register_route' => true,
'openapi_doc' => [
'scan_path' => [
base_path('app/api'),
],
'modify' => function (OA\OpenApi $openapi) {
$openapi->info->title = config('app.name') . ' API';
$openapi->info->version = '1.0.0';
$openapi->servers = [
new OA\Server([
'url' => '/api',
'description' => request()->host(),
]),
];
if (!$openapi->components instanceof OA\Components) {
$openapi->components = new OA\Components([]);
}
$openapi->components->securitySchemes = [
new OA\SecurityScheme([
'securityScheme' => 'api_key',
'type' => 'apiKey',
'name' => config('core.jwt.app.token_name', 'Authorization'),
'in' => 'header',
]),
];
},
],
]);
});
```
## Plugin Route Template
```php
<?php
declare(strict_types=1);
/**
*+------------------
* madong
*+------------------
* Copyright (c) https://gitee.com/motion-code All rights reserved.
*+------------------
* Author: Mr. April (405784684@qq.com)
*+------------------
*/
use Webman\Route;
use WebmanTech\Swagger\Swagger;
use OpenApi\Annotations as OA;
/**
* 注册{Plugin}插件路由
*/
Route::group('/{plugin_path}', function () {
// AdminAPI 路由
Route::group('/adminapi', function () {
// 控制器自动加载,无需手动注册
});
// API 路由
Route::group('/api', function () {
// 控制器自动加载,无需手动注册
});
// Swagger 文档注册
Swagger::create()->registerRoute([
'route_prefix' => '/openapi',
'register_route' => true,
'openapi_doc' => [
'scan_path' => [
// 插件的 adminapi 目录
__DIR__ . '/app/adminapi',
// 插件的 api 目录
__DIR__ . '/app/api',
],
'modify' => function (OA\OpenApi $openapi) {
$openapi->info->title = '{Plugin} API';
$openapi->info->version = '1.0.0';
$openapi->servers = [
new OA\Server([
'url' => '/{plugin_path}',
'description' => request()->host(),
]),
];
if (!$openapi->components instanceof OA\Components) {
$openapi->components = new OA\Components([]);
}
$openapi->components->securitySchemes = [
new OA\SecurityScheme([
'securityScheme' => 'api_key',
'type' => 'apiKey',
'name' => config('madong.jwt.app.token_name', 'Authorization'),
'in' => 'header',
]),
];
},
],
]);
});
```
## Route Auto-Discovery
Controllers are auto-loaded by webman based on naming convention:
| Controller | Auto Route |
|------------|------------|
| `adminapi/controller/member/MemberController.php` | `/adminapi/member/member` |
| `adminapi/controller/member/UserController.php` | `/adminapi/member/user` |
| `api/controller/auth/AuthController.php` | `/api/auth/auth` |
### Route Naming Convention
```
app/adminapi/controller/{module}/{Model}Controller.php
↓
/{module}/{model}
```
## Swagger Scan Path Configuration
### AdminAPI OpenAPI Scan
```php
'scan_path' => [
base_path('app/schema'), // Schema DTOs
base_path('app/adminapi'), // AdminAPI controllers, validates
base_path('app/install'), // Install controllers
],
```
### API OpenAPI Scan
```php
'scan_path' => [
base_path('app/api'), // API controllers
],
```
## Custom OpenAPI JSON Endpoint
When the project requires the Swagger UI to load `/openapi.json` instead of the package default `/openapi/doc`, do not modify `vendor/webman-tech/swagger`.
Use `app\controller\OpenApiController` to render the Swagger UI and generate the JSON document with `ConfigOpenapiDocDTO` and `WebmanTech\Swagger\Overwrite\Generator`. In each API route group:
```php
$openApiController = new OpenApiController();
Route::get('/openapi', static fn () => $openApiController->index('/api/openapi.json'));
Route::get('/openapi.json', static fn () => $openApiController->document($openapiDocConfig));
$config = ConfigOpenapiDocDTO::fromConfig($openapiDocConfig);
RouteRegister::create()->register((new Reader())->getData($config->getScanSources()));
```
For Admin API, use `/adminapi/openapi.json` as the Swagger UI document URL. Keep the existing scan paths and OpenAPI `modify` callback in `$openapiDocConfig` so generated documentation and annotation route registration remain consistent.
### Plugin OpenAPI Scan
当前项目插件路由以 `plugin/{plugin}/config/route.php` 为入口,按访问端分成独立路由组。已验证的 `produce` 插件使用以下分组:
- `/api`:前台 Web 接口,扫描 `base_path('plugin/{plugin}/app/api')`。
- `/appapi`:移动端/业务端 APP 接口,扫描 `base_path('plugin/{plugin}/app/appapi')`。
- `/adminapi`:管理端接口,扫描 `base_path('plugin/{plugin}/app/adminapi')`。
为插件新增业务端接口时,不要把 APP 控制器放进 `app/api`;应放入 `plugin/{plugin}/app/appapi/controller`,并在插件路由中新增或确认 `/appapi` 分组扫描该目录。OpenAPI `servers.url` 对应设置为 `/appapi`。
```php
'scan_path' => [
base_path('plugin/{plugin}/app/appapi'),
],
```
## Auto-generation Checklist
When generating route:
- [ ] Create adminapi/config/route.php with Swagger
- [ ] Create api/config/route.php with Swagger
- [ ] Configure scan_path to include all relevant directories
- [ ] Set correct security scheme (Authorization header)
- [ ] Configure server URL and description
- [ ] For plugins, use __DIR__ for relative paths