2014-11-21 4 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의 기본 보기 액션를 재정의해야합니다 단일 데이터 자원 객체를 봉투의 To :

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

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

오래된,하지만 난 그냥 같은 문제를 여기에 부딪쳤다 .

그리고 더 나은 (내 생각) 해결책을 발견 :

public $serializer = [ 
    'class'    => '[your-namespace]\Serializer', 
    'collectionEnvelope' => 'list', 
    'itemEnvelope'  => 'item' 
]; 
: 다음과 같이 사용 후

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; 
    } 
} 

을 그리고 : 시리얼 \ 자신의 시리얼 클래스 확장 \의 YII의 \ 휴식을 만들