Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Yi2在JSON响应中封装单个数据_Php_Json_Rest_Yii2_Envelope - Fatal编程技术网

Php Yi2在JSON响应中封装单个数据

Php Yi2在JSON响应中封装单个数据,php,json,rest,yii2,envelope,Php,Json,Rest,Yii2,Envelope,我阅读了官方指南,找到了一种封装JSON数据的方法,如下所示 use yii\rest\ActiveController; class UserController extends ActiveController { public $modelClass = 'app\models\User'; public $serializer = [ 'class' => 'yii\rest\Serializer', 'collectionEnve

我阅读了官方指南,找到了一种封装JSON数据的方法,如下所示

use yii\rest\ActiveController;

class UserController extends ActiveController
{
    public $modelClass = 'app\models\User';
    public $serializer = [
        'class' => 'yii\rest\Serializer',
        'collectionEnvelope' => 'items',
    ];
}
{
     products:....
}
当我有一个收藏,然后我有一个这样的回应时,这是完美的

use yii\rest\ActiveController;

class UserController extends ActiveController
{
    public $modelClass = 'app\models\User';
    public $serializer = [
        'class' => 'yii\rest\Serializer',
        'collectionEnvelope' => 'items',
    ];
}
{
     products:....
}
但我想做的是,我有一个单一数据的信封。例如,如果我执行产品/10 GET请求以获取

{
    product:
}

希望有人能找到答案。

单个数据信封不受支持。至少在Yii 2.0.6之前,只有集合才会被封装,以便将
\u链接
\u元
数据对象添加到响应中

要封装单个数据资源对象,您需要覆盖控制器中的ActiveController默认的查看操作

public function actions()
{
$actions=parent::actions();
未设置($actions['view']);
返回$actions;
}
公共函数actionView($id)
{
$model=Product::findOne($id);
返回['product'=>$model];
}

很老了,但我在这里遇到了同样的问题

并找到了一个更好的(我认为)解决方案:创建自己的序列化程序类,扩展\yii\rest\serializer:

class Serializer extends \yii\rest\Serializer
{
  public $itemEnvelope;

  public function serializeModel($model)
  {
      $data = parent::serializeModel($model);
      if($this->itemEnvelope)return [$this->itemEnvelope=>$data];
      return $data;
  }
}
然后像这样使用它:

    public $serializer = [
    'class'              => '[your-namespace]\Serializer',
    'collectionEnvelope' => 'list',
    'itemEnvelope'       => 'item'
];