用yii2搭建了一个restful风格api接口,想要通过配置文件直接就强制所有action直接返回json数据格式,结果发现移动只要继承use yii\rest\ActiveController;控制器配置文件bootstrap和response的配置就会失效。最后看源码发现ActiveController继承\vendor\yiisoft\yii2\rest\Controller.php控制器里面通过behaviors行为重写了返回信息的数据格式。那么如果选择继承ActiveController控制器的话就只能在当前的行为重写返回数据格式规则,这样就需要每个控制器都去写规则了,如果想全局只能从配置文件里在response里执行到最后截取要出去数据根据自己的需求定义再输出,但是这样又不够灵活,自己看着办吧。参考如下配置内容根据自己需要修改:
return [ 'id' => 'app-api', 'basePath' => dirname(__DIR__), 'controllerNamespace' => 'api\controllers', 'bootstrap' => [ 'log', [ 'class' => 'yii\filters\ContentNegotiator', 'formats' => [ 'application/json' => yii\web\Response::FORMAT_JSON, //'text/html' => yii\web\Response::FORMAT_JSON, //'application/xml' => yii\web\Response::FORMAT_XML, ], ] ], 'modules' => [ 'v1' => [ //module 与gii生成module配置的ModuleID 一致 'class' => 'api\modules\v1\Module', ], ], 'components' => [ 'request' => [ 'csrfParam' => '_csrf-api', 'parsers' => [ //返回的数据格式为json 'application/json' => 'yii\web\JsonParser', 'text/json' => 'yii\web\JsonParser', ], ], //'response' => [ // 'on beforeSend' => function($event) { // if(is_array($event->sender->data)){ // $event->sender->format = 'json'; // } // }, //], 'response' => [ 'format' => 'json',//全局controller 返回json 不包括 ActiveController 会被行为重写 //'charset' => 'UTF-8', ], 'response' => [ 'format' => 'json', 'formatters' => [ \yii\web\Response::FORMAT_JSON => [ 'class' => 'yii\web\JsonResponseFormatter', 'prettyPrint' => YII_DEBUG, // use "pretty" output in debug mode 'encodeOptions' => JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE, // ... ], ], ], 'response' => [ 'class' => 'yii\web\Response', 'on beforeSend' => function ($event) { $response = $event->sender; $response->data = [ 'success' => $response->isSuccessful, 'code' => $response->getStatusCode(), 'message' => $response->statusText, 'data' => $response->data, ]; $response->statusCode = 200; }, ],
在当前控制器里重写ActiveController控制器里的行为内容,参考着用。
class DefaultController extends ActiveController { /** * Renders the test view for the module * @return string */ //public function behaviors() //{ // return [ // [ // 'class' => 'yii\filters\ContentNegotiator', // 'only' => ['view', 'index'], // in a controller // // if in a module, use the following IDs for user actions // // 'only' => ['user/view', 'user/index'] // 'formats' => [ // 'application/json' => Response::FORMAT_JSON, // ], // 'languages' => [ // 'en', // 'de', // ], // ], // ]; //} public function behaviors() { $behaviors = parent::behaviors(); $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON; //print_r($behaviors);exit; return $behaviors; }