Files
MrleeAdmin/.windsurf/skills/backend-route/SKILL.md
T
2026-08-31 11:33:59 +08:00

8.9 KiB

name, description
name description
backend-route 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

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

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

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

'scan_path' => [
    base_path('app/schema'),      // Schema DTOs
    base_path('app/adminapi'),    // AdminAPI controllers, validates
    base_path('app/install'),     // Install controllers
],

API OpenAPI Scan

'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:

$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。

'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