Отдельные данные конверта Yii2 в ответе JSON

Я просмотрел официальное руководство и нашел способ обернуть данные 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:
}

Надеюсь, кто-нибудь понял это.

2

Решение

Одиночный конверт данных не поддерживается \ Юй \ остальное \ 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];
}
1

Другие решения

Старый, но я просто столкнулся здесь с той же проблемой.

И нашел лучшее (я думаю) решение: создайте свой собственный класс сериализатора, расширяющий \ 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'
];
0

По вопросам рекламы [email protected]