0

我正在使用 Yii2 基本模板构建 REST API。我收到一个错误:

exception 'yii\base\InvalidArgumentException' with message 'Response content must be a string or an object implementing __toString().' in /Users/aurasix/ASX-Startups/ASX-CMS/asx-api-yii/vendor/yiisoft/yii2/web/Response.php:1062

Copy Stacktrace Search Stackoverflow Search Google Exception
Invalid Argument – yii\base\InvalidArgumentException
Response content must be a string or an object implementing __toString().

我正在关注 yii2 网站上的指南:https ://www.yiiframework.com/doc/guide/2.0/en/rest-resources

尝试使用集合,以便将来使用分页和排序,我错过了什么吗?

我知道如果我使用 ActiveController 可能会更容易,但我想了解整个过程,这就是我使用 Controller 的原因。我也想要完全控制,我认为 ActiveController 将通过定义模型来发布所有方法,对吧?

我的控制器我不是从 ActiveController 而是从 Controller 扩展它

namespace app\modules\v1\controllers;

use yii\web\Controller;
use app\modules\v1\models\Blog;
use yii\data\ActiveDataProvider;

class BlogController extends Controller {

    public $serializer = [
        'class' => 'yii\rest\Serializer',
        'collectionEnvelope' => 'items',
    ];

    public function actionIndex() {
        return new ActiveDataProvider([
            'query' => Blog::find()
        ]);
    }

}

我的模型:

namespace app\modules\v1\models;

use yii\db\ActiveRecord;
use yii\web\Linkable;

class Blog extends ActiveRecord implements Linkable {

    public static function tableName() {
        return 'blog_post';
    }

    public function fields() {
        return [
            'id',
            'slug',
            'title',
            'full_content'
        ];
    }

    public function extraFields() {
        return [
            'publish_date',
            'short_content'
        ];
    }

    public function getLinks() {
        return [

        ];
    }

}

在 config.php

'response' => [
            '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,
                ],
            ],
        ],
'urlManager' => [
            'enablePrettyUrl' => false,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => 'v1/blog',
                    'pluralize'=>false
                ]
            ],
        ]
4

2 回答 2

1

您可能应该将yii\rest\Controller其用作基本控制器类。它不会像你那样做所有的魔法yii\rest\ActiveController,但它包含一些基本的请求过滤和响应格式化功能。

yii\web\Controller不包含$serializer属性,它不会序列化你的动作响应,所以你不能ActiveDataProvider在动作方法中返回。您应该查看yii\rest\Controller源代码- 它用于afterAction()序列化ActiveDataProvider从操作返回的。没有它,您将无法通过$serializer属性配置序列化程序或ActiveDataProvider在操作方法中返回。

于 2018-04-13T22:42:42.813 回答
1

Yii REST Services 主要为您提供 2 种类型的控制器,它们是

  • yii\rest\ActiveController
  • yii\rest\Controller

您需要从yii\rest\Controllernot扩展您的控制器,因为没有您尝试指定yii\web\Controller的名称$serializer的属性,但yii\web\Controlleryii\rest\Controller

于 2018-04-13T22:43:04.397 回答