Yii2高级版报错Response content must not be an array,求解决方案
解决Yii2中"Response content must not be an array."错误
这个错误的核心原因很明确:Yii2的Web响应组件默认要求返回的内容是字符串类型(比如HTML、JSON字符串),而你的控制器直接返回了数据库查询得到的数组,框架无法处理这种类型的响应内容,因此触发了InvalidArgumentException。
快速修复方案(推荐)
因为你是通过Ajax请求获取数据,最合理的做法是返回JSON格式的响应。Yii2提供了便捷的asJson()方法来自动处理数组到JSON的序列化:
修改控制器代码
public function actionGetuser() { $model = new UsersData(); if(Yii::$app->request->isAjax){ // 注意:原代码中直接post()获取的是整个POST数组,这里要取出具体的id字段 $id = Yii::$app->request->post('id'); // 使用asJson()将数组转为JSON响应 return Yii::$app->response->asJson($model->get($id)); } // 处理非Ajax请求的情况,返回404或其他提示 throw new \yii\web\NotFoundHttpException('Invalid request type'); }
修复模型中的SQL注入风险
你的get()方法存在严重的SQL注入漏洞,直接将用户输入拼接到SQL语句中非常危险。修改为参数绑定的方式:
public function get($id) { return Yii::$app->db->createCommand("SELECT * FROM user where id=:id") ->bindValue(':id', $id) ->queryOne(); }
另一种修复方式:手动设置响应格式
如果你需要更灵活地控制响应,可以手动指定响应格式为JSON:
public function actionGetuser() { $model = new UsersData(); if(Yii::$app->request->isAjax){ $id = Yii::$app->request->post('id'); $response = Yii::$app->response; $response->format = \yii\web\Response::FORMAT_JSON; $response->data = $model->get($id); return $response; } throw new \yii\web\NotFoundHttpException('Invalid request type'); }
为什么这样能解决问题?
在Yii2的Response::prepare()方法(也就是报错的Response.php:1054位置),框架会校验响应内容的类型:
- 默认格式下,只允许字符串、
yii\web\HtmlResponseFormatter支持的类型,或者已经设置了对应格式化器的响应格式。 - 当你指定
FORMAT_JSON或者使用asJson()时,框架会自动使用JsonResponseFormatter将数组序列化为合法的JSON字符串,符合响应内容的要求。
内容的提问来源于stack exchange,提问作者Parveen Chauhan
相关产品推荐
相关产品推荐

