2014-11-21 52 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' 
];