2014-11-21 64 views
2

我经历了官方指南,并找到了一种像这样包含JSON数据的方法。Yii2在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: 
} 

希望有人想通了。

回答

1

\yii\rest\Serializer不支持单个数据信封。至少在Yii 2.0.6之前,只有收集才会被封装,以便将_links_meta数据对象添加到响应中。

到信封单一数据源对象,你需要将自己的控制器内覆盖ActiveController的默认观点行动

public function actions() 
{ 
    $actions = parent::actions(); 
    unset($actions['view']); 
    return $actions; 
} 

public function actionView($id) 
{ 
    $model = Product::findOne($id); 
    return ['product' => $model]; 
} 
0

老,但我只是碰到了在这里同样的问题。

而且找到了一个更好的(我认为)的解决方案:创建自己的序列化器类扩展\警予\其他\串行:

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' 
];