Я строю 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
]
],
]
Вы, вероятно, должны использовать yii\rest\Controller
в качестве базового класса контроллера. Это не сделает всю магию для вас, как yii\rest\ActiveController
делать, но он содержит некоторые основные функции фильтрации запросов и форматирования ответов.
yii\web\Controller
не содержит $serializer
свойство, оно не будет сериализовать ваш ответ на действие, поэтому вы не можете вернуть ActiveDataProvider
в действии метод.
Вы должны смотреть на yii\rest\Controller
исходный код — оно использует afterAction()
сериализовать ActiveDataProvider
вернулся из действия. Без этого вы не сможете настроить сериализатор через $serializer
собственность или возврат ActiveDataProvider
в действии метод.
Службы Yii REST предоставляют в основном 2 типа контроллеров, которые
yii\rest\ActiveController
yii\rest\Controller
Вы должны расширить свой контроллер от yii\rest\Controller
не yii\web\Controller
так как нет собственности с именем $serializer
за yii\web\Controller
что вы пытаетесь указать, но для yii\rest\Controller