我正在使用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 [
];
}
}
答案 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}}