Yii2 — API Rest — ActiveDataProvider

Я строю REST API с использованием базового шаблона Yii2. Я получаю ошибку:

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, но из контроллера

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
]
],
]

0

Решение

Вы, вероятно, должны использовать yii\rest\Controller в качестве базового класса контроллера. Это не сделает всю магию для вас, как yii\rest\ActiveController делать, но он содержит некоторые основные функции фильтрации запросов и форматирования ответов.

yii\web\Controller не содержит $serializer свойство, оно не будет сериализовать ваш ответ на действие, поэтому вы не можете вернуть ActiveDataProvider в действии метод.
Вы должны смотреть на yii\rest\Controller исходный код — оно использует afterAction() сериализовать ActiveDataProvider вернулся из действия. Без этого вы не сможете настроить сериализатор через $serializer собственность или возврат ActiveDataProvider в действии метод.

1

Другие решения

Службы Yii REST предоставляют в основном 2 типа контроллеров, которые

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

Вы должны расширить свой контроллер от yii\rest\Controller не yii\web\Controller так как нет собственности с именем $serializer за yii\web\Controller что вы пытаетесь указать, но для yii\rest\Controller

1

По вопросам рекламы [email protected]