Фрактальный трансформер с различными сериализаторами для вложенных предметов и коллекций

Чтобы изменить вывод JSON, отправленный с помощью Laravel 5.4 RESTful API, я использую пакет Fractal от thephpleague. Поскольку разбиение на страницы будет добавлено в будущем, важно, чтобы в коллекциях использовался DataArraySerializer по умолчанию, а в отдельных элементах использовался ArraySerializer. Также необходимо, чтобы более глубокие вложенные объекты имели одинаковую структуру. Как я могу достичь этого (глобально или нет)?

class TreeTransformer extends TransformerAbstract {
protected $defaultIncludes = [
'type',
'branches'
];

public function transform(Tree $tree) {
return [
'id' => (int)$tree->id,
'name' => (string)$tree->name
];
}

public function includeType(Tree $tree) {
return $this->item($tree->type, new TypeTransformer()); // Should be ArraySerializer
}

public function includeBranches(Tree $tree) {
return $this->collection($tree->branches, new BranchTransformer()); // Should stay DataArraySerializer
}
}

2

Решение

К сожалению, я думаю, что вы пытаетесь сделать, пока невозможно. Больше информации здесь: https://github.com/thephpleague/fractal/issues/315

Вы можете изменить сериализатор для всего вывода, например так: https://github.com/spatie/fractalistic#using-a-serializer. Но это не то, чего вы хотите достичь.

0

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

На самом деле вы можете.
Это может выглядеть более многословно, но трюк просто не использует $defaultIncludes, Вместо этого используйте фрактальный помощник.

class TreeTransformer extends TransformerAbstract {

public function transform(Tree $tree) {
return [
'id' => (int)$tree->id,
'name' => (string)$tree->name,
'type' => $this->serializeType($tree)
'branches' => $this->serializeBranches($tree)
];
}

private function serializeType(Tree $tree) {
return fractal()
->serializeWith(new ArraySerializer())
->collection($tree->type)
->transformWith(TypeTransformer::class)
->toArray(); // ArraySerializer
}

private function serializeBranches(Tree $tree) {
return fractal()
->serializeWith(new DataArraySerializer())
->collection($tree->branches)
->transformWith(BranchesTransformer::class)
->toArray(); // DataArraySerializer
}
}

Это работает для меня с ArraySerializer, Не пробовал DataArraySerializer,

0

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