api访问频率限制
1.修改需要限制频率的用户model类,使其继承RateLimitInterface接口,
use yii\filters\RateLimitInterface;
2.实现该接口需要实现的3个方法

//频率限制
    public function getRateLimit($request,$action){
        return [2,1];//每秒请求2 times
    }

    public function loadAllowance($request,$action){
        return [$this->allowance,$this->allowance_updated_at];
    }

    public function saveAllowance($request,$action,$allowance,$timestamp){
        $this->allowance = $allowance;
        $this->allowance_updated_at = $timestamp;
        $this->save();
    }

3.修改控制器的behaviors(好像不加这一步也可以实现频率限制)

//频率限制
        $behaviors['rateLimiter']=[
            'class'=>RateLimiter::className(),
            'enableRateLimitHeaders'=>true,
        ];

版本控制

1.利用yii2系统自带的gii工具生成module,系统的目录结构参考api/modules/v2/controllers/
2.修改config/main.php文件,添加module,添加route

'modules' => [
        'v2' => [
            'class' => 'api\modules\v2\Module',
        ],
    ],
 ...
 [
                    'class' => 'yii\rest\UrlRule', 
                     'controller' => ['v2/test'], //版本2,test为控制器名称
                     'pluralize'=>false,//url不带复数
]   

返回数据格式化

1.可以在config/main.php里面定义response

'response' => [
            'class' => 'yii\web\Response',
            'on beforeSend' => function ($event) {
                $response = $event->sender;
                $response-> format = yii\web\Response::FORMAT_JSON; //定义所有控制器的返回数据格式


            },
        ]

2.也可以在单个控制器里面设定该控制器的返回格式化的数据

ps:格式响应:定义当前控制器的返回数据格式:(如果main.php和里面的behaviors同时定义了,则以里面定义为主)

      //  $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_HTML;//Response::FORMAT_XML;Response::FORMAT_JSON;

返回数据自定义错误数据格式

修改config/main.php,在beforeSend里添加如下代码:

$response-> format = yii\web\Response::FORMAT_JSON;//自定义返回的数据类型必须和这里的定义一致,不然会报错
$response->statusCode = 200;//自定义返回错误码,方便前端统一用json格式处理数据
                $obj = 
                [
                    'success'=>$response->isSuccessful,
                    'code'=>$response->getStatusCode(),
                    'data'=>$response->data,
                    'message'=>$response->statusText
                ];
                $response-> data = $obj;