Laravel 项目全自动接口管理(常用注解与对应生成代码)

前言

接口工具使用注解来增强接口表达能力。在一般情况下,一个注解只会产生一种效果,如表示数据字段可以为空(Optional)、强制从Eloquent中指定字段获取数据(DBField)、控制器使用指定中间件(Middlewares)等。

注解列表

元注解

@Extendable

该注解只能使用在注解上,被该注解修饰的注解会由父节点向子节点传递,而当子节点存在和父节点相同的注解时,子节点的注解会覆盖父节点注解。典型例子是Middlewares注解,在Contrller上使用Middlewares注解,其下的每个Action都将默认使用相同的Middlewares。

示例

@Retention(RetentionPolicy.RUNTIME)
@Extendable
public @interface Middleware {
String[] value() default "";
}

API级注解

@Middlewares(String[])

指示Controller/Action使用指定的中间件

示例

            @Middleware("auth")
            class GetUsers {
            }

生成代码效果

Route::match(['POST'], '/v1/user/get_users', 'V1\UserController@GetUsers')->middleware(['auth']);

@Methods(MethodType[])

表示HTTP请求类型

为了测试方便,所有接口都支持POST方式请求,调用方可以根据实际情况使用合适的方式。

参数

public enum MethodType {
    GET, POST, PUT, PATCH, DELETE, UPDATE;
}

示例

            @Methods({MethodType.POST})
            class GetUsers {
                @Request
                String[] strings;
                @Request
                int[] ints;
            }

生成代码效果

Route::match(['POST', 'POST'], '/v1/admin_user/get_users', 'V1\AdminUserController@GetUsers');

@Request / @Response

标注该数据字段应出现在请求中或响应中。

示例

            /**
             * 取得一篇文章
             */
            class GetArticle {
                @Request
                Integer id;
                @Response
                Models.Article article;
            }

生成代码

    public function requestRules()
    {
        return [
            ['title', 'title', 'bail|String', null],
            ['content', 'content', 'bail|String', null],
        ];
    }

    public function responseRules()
    {
        return [
            ['article', 'article', ArticleModel::class, Constants::IS_MODEL],
        ];
    }

模型注解

@DBField(String)

该注解只能用在字段上
当从json或Eloquent中初始化数据时,如果接口传递数据的key和数据来源的key不同,可以指定数据来源为参数中的key。
如果不使用该注解,默认获取small snake传递small camel。

示例


        /**
         * 模拟一个老师的信息
         */
        class Teacher {
            @DBField("id")
            int teacherId;
        }

生成效果


    public function getAttributeMap()
    {
        return [
            ['teacherId', 'id', 'bail|int', null],
        ];
    }

字段级注解

@Optional

表示字段是可以为空的,在数据字段自动过滤时,将允许空字段通过。

示例


        class Article {
            @Optional
            @Mutable
            Integer id;
        }

生成代码


    public function getAttributeMap()
    {
        return [
            ['id', 'id', 'nullable|bail|Integer', Constants::IS_OPTIONAL],
        ];
    }

枚举注解

@StringEnum

字段规则不使用自增ID,而改用实际对应的key。
示例

        @StringEnum
        enum PayWay {
            WECHAT,
            ALIPAY,
        }

生成代码

class PayWay extends Enum
{
    public const WECHAT = 'WECHAT';

    public const ALIPAY = 'ALIPAY';

    public const _MAP = [
        self::WECHAT => 'WECHAT',
        self::ALIPAY => 'ALIPAY',
    ];

}

@AsBO

将不止生成带版本信息的枚举,还会根据currentTemplate中的信息生成一份枚举代码(BO)。
后续将允许该注解使用在model上。

示例

        @StringEnum
        @AsBO
        enum PayWay {
            WECHAT,
            ALIPAY,
        }

生成代码

<?php

namespace App\Generated\BOs\Enums;

use YetAnotherGenerator\BOs\Enum;

class PayWay extends Enum
{
    public const WECHAT = 'WECHAT';

    public const ALIPAY = 'ALIPAY';

    public const _MAP = [
        self::WECHAT => 'WECHAT',
        self::ALIPAY => 'ALIPAY',
    ];

}

测试相关注解

@Mutable

在使用自动回归测试时,将会将字段转换为*,表示该字段不需要校验。

示例

        class Article {
            @Optional
            @Mutable
            Integer id;
            String title;
            @Optional
            String content;
            Models.User user;
            Enums.ArticleStatus status;
            @Optional
            Integer commentsCount;
            /**
             * 需要时用于标记是否收藏
             */
            @Optional
            Boolean favorite;
            /**
             * 是否是添加火热标记
             */
            @Optional
            Boolean hot;
            Date createdAt;
        }

效果

{
    "status": 0,
    "message": "success",
    "data": {
        "articles": [
            {
                "id": "*",
                "title": "nf1s4836nntQxE2oWWvk",
                "content": null,
                "user": {
                    "name": "Ttdnts",
                    "id": "*",
                    "avatar": "https://avatars3.githubusercontent.com/u/25639206?s=88&v=4"
                },
                "status": 1,
                "commentsCount": 1,
                "favorite": null,
                "hot": null,
                "createdAt": "2018-12-30 16:11:32"
            },
本作品采用《CC 协议》,转载必须注明作者和本文链接
为码农摸鱼事业而奋斗
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!