亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频

Action 注解

控制器類 action 注解指的是可以在控制器類中 action 方法中聲明使用的注解標(biāo)簽,包括 ApiParamExtendParam 三個(gè)注解標(biāo)簽。用于實(shí)現(xiàn)對傳遞到 action 方法的參數(shù)的約束邏輯判斷及注解文檔的生成。

Api

標(biāo)記當(dāng)前的 actionapi

注解字段說明

apiName

該字段用于說明當(dāng)前 api 在注解文檔中展示的標(biāo)題名稱。

allowMethod

該字段用于限制當(dāng)前 api 允許請求的請求方法,可配置的值可查看枚舉類 \EasySwoole\HttpAnnotation\Enum\HttpMethod ,不配置時(shí)默認(rèn)為 [HttpMethod::GET,HttpMethod::POST]。開發(fā)者可能會(huì)對部分接口限制只能允許 GET 方法請求,這時(shí)就可以配置這個(gè)字段來限制請求方法。

requestPath

該字段用于說明請求當(dāng)前 api,可注冊到 fast-route,也作為注解文檔中的 api 請求路徑。

注意:如果不把 Api 注解中的 requestPath 注入到 EasySwoole 框架的 Router ,這個(gè)字段僅能作為注解文檔聲明,沒有其他作用,并不會(huì)使用該字段的值作為路由提供訪問,客戶端實(shí)際請求時(shí)也是執(zhí)行 EasySwoole 框架的默認(rèn)解析。關(guān)于如何將 requestPath 注入到 EasySwoole 框架的 Router 請看下文說明。

requestParam

該字段用于定義當(dāng)前 api action 方法客戶端需要傳遞的參數(shù)及限制約束規(guī)則,該字段接收一個(gè) Param 對象數(shù)組。實(shí)現(xiàn)對傳遞的參數(shù)進(jìn)行校驗(yàn)。使用示例如:

<?php

namespace App\HttpController;

use EasySwoole\HttpAnnotation\Attributes\Api;
use EasySwoole\HttpAnnotation\Attributes\Description;
use EasySwoole\HttpAnnotation\Attributes\Param;
use EasySwoole\HttpAnnotation\Enum\HttpMethod;
use EasySwoole\HttpAnnotation\Enum\ParamFrom;
use EasySwoole\HttpAnnotation\Validator\Optional;

class Index extends Base
{
    #[Api(
        apiName: "home",
        allowMethod: HttpMethod::GET,
        requestPath: "/test/index",
        requestParam: [
            new Param(
                name: "account",
                from: ParamFrom::GET,
                validate: [
                    new Optional()
                ],
                value: 1,
                description: new Description("翻頁參數(shù)")
            )
        ],
    )]
    function index(string $account)
    {
        $this->writeJson(200, null, "account is {$account}");
    }
}

responseParam

該字段主要用于自動(dòng)生成文檔時(shí),響應(yīng)參數(shù)的描述說明。

requestExamples

該字段主要用于自動(dòng)生成文檔時(shí),請求參數(shù)示例的描述說明。

responseExamples

該字段主要用于自動(dòng)生成文檔時(shí),響應(yīng)參數(shù)示例的描述說明。

description

該字段主要用于自動(dòng)生成文檔時(shí),api 的描述說明。

Api 注解的 requestPath 注入路由

修改 App\HttpController\Router.php 類文件,在 initialize 方法中添加 \EasySwoole\HttpAnnotation\Utility::mappingRouter($routeCollector, __DIR__); 即可。

<?php

namespace App\HttpController;

use EasySwoole\Http\AbstractInterface\AbstractRouter;
use EasySwoole\HttpAnnotation\Utility;
use FastRoute\RouteCollector;

class Router extends AbstractRouter
{
    function initialize(RouteCollector $routeCollector)
    {
        // 將所有 `Api` 注解的 `requestPath` 注入路由
        Utility::mappingRouter($routeCollector, __DIR__);
    }
}

這樣就可以把所有 Api 注解中的 requestPath 注入到 fast-route,具體用法查看 動(dòng)態(tài)路由 章節(jié)。

使用示例

<?php

namespace App\HttpController;

use EasySwoole\HttpAnnotation\Attributes\Api;
use EasySwoole\HttpAnnotation\Attributes\Description;
use EasySwoole\HttpAnnotation\Attributes\Param;
use EasySwoole\HttpAnnotation\Document\Document;
use EasySwoole\HttpAnnotation\Enum\HttpMethod;
use EasySwoole\HttpAnnotation\Enum\ParamFrom;
use EasySwoole\HttpAnnotation\Validator\Integer;
use EasySwoole\HttpAnnotation\Validator\IsUrl;
use EasySwoole\HttpAnnotation\Validator\MaxLength;
use EasySwoole\HttpAnnotation\Validator\Min;
use EasySwoole\HttpAnnotation\Validator\MinLength;
use EasySwoole\HttpAnnotation\Validator\Optional;
use EasySwoole\HttpAnnotation\Validator\OptionalIfParamMiss;
use EasySwoole\HttpAnnotation\Validator\OptionalIfParamSet;
use EasySwoole\HttpAnnotation\Validator\Required;

class Index extends Base
{
    #[Api(
        apiName: "home",
        allowMethod: HttpMethod::GET,
        requestPath: "/test/index.html",
        requestParam: [
            new Param(
                name: "account",
                from: ParamFrom::GET,
                validate: [
                    new Optional()
                ],
                value: 1,
                description: new Description("翻頁參數(shù)")
            )
        ],
        description: new Description(__DIR__ . '/../../res/description.md', Description::MARKDOWN_FILE)
    )]
    public function index(string $account)
    {
        $this->writeJson(200, null, "account is {$account}");
    }

    #[Api(
        apiName: "hello",
        allowMethod: [HttpMethod::POST, HttpMethod::GET],
        requestPath: "/test/hello.html",
        requestParam: [
            new Param(name: "account", from: ParamFrom::GET, validate: [
                new Required(),
                new MaxLength(maxLen: 15),
            ], description: new Description("用戶登錄的賬戶Id,這個(gè)參數(shù)一定要有啊"))
        ],
        description: new Description("這是一個(gè)接口說明啊啊啊啊")
    )]
    public function hello(string $account)
    {
        $this->writeJson(200, null, "account is {$account}");
    }

    public function doc()
    {
        $path      = __DIR__;
        $namespace = 'App\HttpController';
        $doc       = new Document($path, $namespace);
        $this->response()->write($doc->scanToHtml());
    }

    #[Api(
        apiName: 'url',
        requestParam: [
            new Param(
                name: "url",
                validate: [
                    new IsUrl()
                ]
            )
        ]
    )]
    public function url()
    {

    }

    #[Api(
        apiName: 'optionalSet',
        requestParam: [
            new Param(
                name: "a",
                validate: [
                    new OptionalIfParamSet("b"),
                    new MinLength("5")
                ]
            ),
            new Param(
                name: "b",
                validate: [
                    new OptionalIfParamSet("a"),
                    new Integer(),
                    new Min(1)
                ]
            )
        ]
    )]
    public function optionalSet()
    {

    }

    #[Api(
        apiName: 'optionalMiss',
        requestParam: [
            new Param(
                name: "a",
                validate: [
                    new Optional(),
                    new MinLength("5")
                ],
            ),
            new Param(
                name: "b",
                validate: [
                    new OptionalIfParamMiss("a"),
                    new Integer(),
                    new Min(1)
                ]
            )
        ]
    )]
    public function optionalMiss()
    {

    }
}

Param

Param 注解的字段說明已經(jīng)在 控制器類注解 章節(jié)進(jìn)行了說明。這里就不再詳細(xì)說明。 這里提到 Param 的使用,是其在 action 方法中的使用說明。

注意:Param 注解在 action 中使用時(shí),不能既在 Api 注解的 requestParam 字段中使用 Param 注解,又在 action 方法上單獨(dú)聲明 Param 注解,這樣做時(shí)會(huì)導(dǎo)致后者失效。所以推薦要么在 Api 注解的 requestParam 字段中使用 Param 注解,要么在不使用 Api 注解的情況下直接單獨(dú)使用 Param 注解,后者這種就不能把定義的 requestPath 注入路由,而是執(zhí)行 EasySwoole 框架默認(rèn)的路由解析模式。

錯(cuò)誤示例:

<?php
namespace App\HttpController;

use EasySwoole\HttpAnnotation\Attributes\Api;
use EasySwoole\HttpAnnotation\Attributes\Param;
use EasySwoole\HttpAnnotation\Validator\MinLength;
use EasySwoole\HttpAnnotation\Validator\Optional;

class User extends Base
{
    #[Api(
        apiName: 'optionalMiss',
        requestParam: [
            new Param(
                name: "a",
                validate: [
                    new Optional(),
                    new MinLength(5)
                ],
            )
        ]
    )]
    #[Param(
        name: "b",
        validate: [
            new Optional(),
            new MinLength(5)
        ],
    )]
    public function optionalMiss()
    {

    }
}

上述 optionalMiss actionParam 注解的參數(shù) b 會(huì)被忽略,既不會(huì)被驗(yàn)證,也不會(huì)注入?yún)?shù)傳參。

正確示例:

<?php
namespace App\HttpController;

use EasySwoole\HttpAnnotation\Attributes\Api;
use EasySwoole\HttpAnnotation\Attributes\Param;
use EasySwoole\HttpAnnotation\Validator\MinLength;
use EasySwoole\HttpAnnotation\Validator\Optional;

class User extends Base
{
    #[Api(
        apiName: 'optionalMiss',
        requestParam: [
            new Param(
                name: "a",
                validate: [
                    new Optional(),
                    new MinLength(5)
                ],
            ),
            new Param(
                name: "b",
                validate: [
                    new Optional(),
                    new MinLength(5)
                ],
            )
        ]
    )]
    public function optionalMiss()
    {

    }
}

使用示例

<?php

namespace App\HttpController\Api;

use EasySwoole\HttpAnnotation\Attributes\Api;
use EasySwoole\HttpAnnotation\Attributes\ApiGroup;
use EasySwoole\HttpAnnotation\Attributes\Description;
use EasySwoole\HttpAnnotation\Attributes\Example;
use EasySwoole\HttpAnnotation\Attributes\Param;
use EasySwoole\HttpAnnotation\Enum\HttpMethod;
use EasySwoole\HttpAnnotation\Enum\ParamFrom;
use EasySwoole\HttpAnnotation\Enum\ParamType;
use EasySwoole\HttpAnnotation\Validator\MaxLength;
use EasySwoole\HttpAnnotation\Validator\Required;

#[ApiGroup(
    groupName: "Api.Auth", description: new Description(__DIR__ . '/../../../res/description.md', Description::MARKDOWN_FILE)
)]
class Auth extends ApiBase
{
    #[Api(
        apiName: "login",
        allowMethod: HttpMethod::GET,
        requestPath: "/auth/login.html",
        requestParam: [
            new Param(name: "account", from: ParamFrom::GET, validate: [
                new Required(),
                new MaxLength(maxLen: 15),
            ], description: new Description("用戶登錄的賬戶Id")),
            new Param(name: "password", from: ParamFrom::GET, validate: [
                new Required(),
                new MaxLength(maxLen: 15),
            ], description: new Description("密碼")),
            new Param(name: "verify", from: ParamFrom::JSON,
                description: new Description("驗(yàn)證碼"),
                type: ParamType::OBJECT,
                subObject: [
                    new Param(name: "code", from: ParamFrom::JSON, validate: [
                        new Required(),
                        new MaxLength(maxLen: 15),
                    ], description: "防偽編號(hào)"),
                    new Param(name: "phone", from: ParamFrom::JSON, description: "手機(jī)號(hào)")
                ])
        ],
        responseParam: [
            new Param(
                name: "code", type: ParamType::STRING
            ),
            new Param(
                name: "Result",
                type: ParamType::LIST,
                subObject: [
                    new Param("token"),
                    new Param("expire")
                ]
            ),
            new Param("msg")
        ],
        requestExamples: [
            new Example(
                [
                    new Param(name: "account", value: "1111", description: "賬號(hào)"),
                    new Param(name: "password", value: "1111", description: "密碼"),
                    new Param(name: "verify", value: "1111", description: new Description('驗(yàn)證碼')),
                ]
            ),
            new Example(
                new Description(__DIR__ . '/../../../res/json.json', Description::JSON_FILE)
            ),
            new Example(
                new Description(__DIR__ . '/../../../res/xml.xml', Description::XML_FILE)
            ),
        ],
        responseExamples: [
            new Example(
                [
                    new Param(name: "result", description: "結(jié)果", subObject: [
                        new Param(name: "id", value: 1, description: "用戶Id"),
                        new Param(name: "name", value: "八九", description: "昵稱")
                    ]),
                    new Param(name: "code", value: "200", description: "狀態(tài)碼"),
                ]
            ),
            new Example(
                [
                    new Param(name: "result", value: "fail", description: "結(jié)果"),
                    new Param(name: "code", value: "500", description: "狀態(tài)碼"),
                ]
            ),
            new Example(
                new Description(__DIR__ . '/../../../res/json.json', Description::JSON_FILE)
            ),
            new Example(
                new Description(__DIR__ . '/../../../res/xml.xml', Description::XML_FILE)
            ),
        ],
        description: new Description("這是一個(gè)接口說明")
    )]
    public function login()
    {

    }
}

ExtendParam

用于子類控制器類在重寫父類控制類的 action 方法時(shí)限制約束傳入子類控制器類的 action 方法參數(shù)。且 ExtendParam 注解只能在 action 中使用一次。

使用示例

Base 類,父類有一個(gè) add action,限制必填參數(shù) param1param2

<?php
namespace App\HttpController;

use EasySwoole\HttpAnnotation\AnnotationController;
use EasySwoole\HttpAnnotation\Attributes\Param;
use EasySwoole\HttpAnnotation\Exception\Annotation;
use EasySwoole\HttpAnnotation\Exception\ValidateFail;
use EasySwoole\HttpAnnotation\Validator\Required;

class Base extends AnnotationController
{
    #[Param(
        name: "param3",
        validate: [
            new Required()
        ]
    )]
    #[Param(
        name: "param4",
        validate: [
            new Required()
        ]
    )]
    public function add()
    {

    }

    protected function onException(\Throwable $throwable): void
    {
        if ($throwable instanceof ValidateFail) {
            $this->writeJson(400, null, $throwable->getMessage());
        } else {
            if ($throwable instanceof Annotation) {
                $this->writeJson(400, null, $throwable->getMessage());
            } else {
                throw $throwable;
            }
        }
    }
}

Index 類,子類控制器,重寫父類 Baseadd action,聲明 ExtendParam 注解指定要約束的參數(shù),所以 add action 由于受到父類參數(shù)約束,所以必填參數(shù) param1param2

<?php
namespace App\HttpController;

use EasySwoole\HttpAnnotation\Attributes\ExtendParam;

class Index extends Base
{
    #[ExtendParam(parentParams: ['param1', 'param2'])]
    public function add()
    {

    }
}
亚洲精品成人_精品成人一区_999视频在线播放_免费黄色在线_亚洲成人久久久_久久www免费视频
  • <kbd id="eqi2k"><code id="eqi2k"></code></kbd><cite id="eqi2k"><tbody id="eqi2k"></tbody></cite>
    99影视tv| 日韩国产欧美一区| 国产视频一区在线观看一区免费| 红桃视频国产精品| 国产精品视频免费观看| 国产乱码一区| 亚洲 日韩 国产第一区| 亚洲精品韩国| 国产亚洲欧美一区二区三区| 天堂资源在线亚洲资源| 亚洲激情网站| 久久99精品久久久久久三级| 欧美久久电影| 国产欧美一区二区视频| 日韩欧美在线观看强乱免费| 亚洲欧洲精品一区二区| 国产精品嫩草在线观看| 中文字幕一区二区三区精彩视频 | 婷婷五月色综合| 亚洲人www| 欧美人与物videos另类| 99视频日韩| 欧美在线一区二区三区四区| 亚洲视频大全| 久久一区二区精品| 99亚洲伊人久久精品影院红桃| 久久久综合亚洲91久久98| 国产精品yjizz| 久久99精品久久久水蜜桃| 在线国产欧美| 青青影院一区二区三区四区| 亚洲一区二区三区高清不卡| 日韩三级电影| 国产传媒一区二区三区| 亚洲高清免费| 在线日韩av永久免费观看| 国产精品日韩一区二区三区| 亚洲美女视频在线免费观看 | 中文字幕一区二区三区乱码 | 久久免费国产| 一区在线视频| 一本色道久久99精品综合| 99re在线观看视频| 国产欧美日韩综合一区在线播放| 午夜精品亚洲一区二区三区嫩草| 成人av资源| 免费视频久久| 日韩视频精品| 亚洲精选91| 欧美一区二区影视| 亚洲欧洲久久| 欧美一区91| 久久国产精品一区二区三区四区| 亚洲经典三级| 国产亚洲在线| 国产伦精品一区二区三| 亚洲午夜激情| 国产精品国产三级国产专区53| 欧美大香线蕉线伊人久久国产精品 | 成人午夜电影免费在线观看| 亚洲国产一区二区精品专区| 亚洲欧洲一区二区福利| 欧美精彩一区二区三区| 国产精品一区二区三区在线| 美女精品网站| 5566中文字幕一区二区| 免费久久久一本精品久久区| 亚洲免费久久| 麻豆久久精品| 久久精品成人| 久久一二三区| 国产日韩三区| 精品欧美一区二区精品久久| 国产伦精品一区二区三区视频孕妇 | 国产一区二区高清视频| 伊人久久综合| 亚洲小说区图片区| 在线视频国内自拍亚洲视频| 亚洲成人资源| 免费亚洲一区二区| 久久九九99| 好吊色欧美一区二区三区视频 | 国产亚洲激情| 国产日韩三区| 肥熟一91porny丨九色丨| 国产高清精品一区二区三区| 久久五月激情| 蜜桃视频在线观看成人| 涩涩日韩在线| 亚洲国产精品第一区二区| 麻豆av一区二区三区| 精品国产一区二区三| 国产欧美一区二区视频| 欧美一区二区三区成人久久片| 日本一区高清不卡| 欧美日韩福利| 99伊人成综合| 成人性色av| 视频一区视频二区视频三区视频四区国产 | 五码日韩精品一区二区三区视频| 97久久天天综合色天天综合色hd| 久久久久久精| 国产麻豆日韩| 一区二区精品在线观看| 国产尤物精品| 91免费看蜜桃| 一本色道婷婷久久欧美| 国产日韩高清一区二区三区在线| 91日韩久久| 亚洲成色最大综合在线| 亚洲无玛一区| 翡翠波斯猫1977年美国| 中文字幕一区二区三区乱码 | 日韩理论片在线观看| 国产综合色一区二区三区| 久久久久久一区| 亚洲成人网上| 美日韩精品免费| 一级日韩一区在线观看| 国产精品日韩欧美一区二区三区| 欧美一区二区三区在线播放| 91久久午夜| 欧美深深色噜噜狠狠yyy| 好吊日精品视频| 另类视频在线观看+1080p| 99国产精品视频免费观看一公开 | 国产精品三区www17con| 亚洲午夜激情在线| 快播亚洲色图| 国产精品三区www17con| 亚洲国产一区在线| 国产精品久久久久久久小唯西川 | 红桃视频亚洲| 蜜桃欧美视频| 每日更新成人在线视频| 欧美日韩三级| 日韩欧美一区二区视频在线播放 | 奇米888一区二区三区| 99国内精品久久久久久久软件| 免费久久久一本精品久久区| 亚洲一区二区精品在线| 中文字幕不卡每日更新1区2区| 国产亚洲精品久久飘花| 久久亚洲影院| 国产精品一区在线观看| 中文字幕中文字幕一区三区| 欧美国产视频在线观看| 99国精产品一二二线| 国产欧美一级| 国产精品五区| 亚洲精品乱码视频| 99精品国产一区二区| 一本色道久久综合| 欧美日韩免费高清| 你懂的一区二区| 欧美在线黄色| 一本一本a久久| 一区二区三区精品国产| 色综合666| 欧美性色黄大片人与善| 欧美国产一区二区在线| 蜜桃91精品入口| 免费不卡亚洲欧美| 久久涩涩网站| 日本一区二区不卡高清更新| 91亚洲精品丁香在线观看| 久久先锋影音| av资源站久久亚洲| 国产精品污www一区二区三区| 99精品欧美一区二区三区| 亚洲在线视频| 久久青青草原一区二区| 99视频在线播放| 精品国产日本| 欧美一区视久久| 在线看成人av电影| 韩日成人在线| 99精品视频免费观看视频| 亚洲一区黄色| 99se婷婷在线视频观看| 国产精品一区二区免费看| 精品国产乱码久久久久久久软件| 欧美高清视频一区| 鲁丝一区二区三区免费| 亚洲一区二三| 亚洲精品九九| 成人看片视频| 日本黑人久久| 亚洲天堂偷拍| 老司机一区二区三区| 国产成人精品免费视频大全最热| 国内不卡一区二区三区| 中文字幕免费在线不卡| 国产亚洲精品久久久久婷婷瑜伽| 免费在线亚洲欧美| 国产偷久久久精品专区| 欧美精品91| 51国产成人精品午夜福中文下载| 欧美激情视频一区二区三区| 一区二区三区在线视频看|