You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:14:49