Yii2 - API Rest - ActiveDataProvider

时间:2018-04-13 21:47:50

标签: php yii2 yii2-api

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

for(char c : new StringBuilder().appendCodePoint(0x1F602).toString().toCharArray()) {
    System.out.print("\\u" + String.valueOf(Integer.toHexString(c)));
}
System.out.println();

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

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

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

我的控制器我没有从ActiveController扩展它,而是从Controller

扩展它
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().

我的模特:

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()
        ]);
    }

}

在config.php中

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 [

        ];
    }

}

2 个答案:

答案 0 :(得分:1)

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

yii\web\Controller不包含$serializer属性,它不会序列化您的操作响应,因此您无法在操作方法中返回ActiveDataProvider。 您应该查看yii\rest\Controller source code - 它使用afterAction()序列化从操作返回的ActiveDataProvider。没有它,您无法通过$serializer属性配置序列化程序或在操作方法中返回ActiveDataProvider

答案 1 :(得分:1)

Yii REST服务主要为您提供两种类型的控制器

  • from msvcrt import getch import dlib import cv2 from lib.capture import Capture win = dlib.image_window() cap = Capture() # Capture image from webcam cap.start() while(True): frame = cap.get() # Get current frame from webcam if frame is not None: frame = cv2.flip(frame, 1) frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) # Converting from RGB to BGR (as dlib.image_window requires) win.set_image(frame) # Display the resulting frame key = ord(getch()) if key == 27: #ESC break
  • yii\rest\ActiveController

您需要从yii\rest\Controller而不是yii\rest\Controller扩展您的控制器,因为您尝试指定的yii\web\Controller没有名称为yii\web\Controller的属性,但{ {3}}