Чтобы изменить вывод 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
}
}
К сожалению, я думаю, что вы пытаетесь сделать, пока невозможно. Больше информации здесь: https://github.com/thephpleague/fractal/issues/315
Вы можете изменить сериализатор для всего вывода, например так: https://github.com/spatie/fractalistic#using-a-serializer. Но это не то, чего вы хотите достичь.
На самом деле вы можете.
Это может выглядеть более многословно, но трюк просто не использует $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
,