Yii2 在 JSON 响应中包络单个数据


Yii2 envelope single data in JSON response

我浏览了官方指南,找到了一种像这样封装JSON数据的方法。

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''rest''Serializer 不支持单个数据信封。至少在 Yii 2.0.6 之前,只有集合被封装,以便向响应中添加_links_meta数据对象。

要包络单个数据资源对象,您需要在控制器中覆盖活动控制器的默认视图操作

public function actions() 
{
    $actions = parent::actions();
    unset($actions['view']);
    return $actions;
}
public function actionView($id)
{
    $model = Product::findOne($id);
    return ['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'
];