У меня есть API, работающий с использованием стандартного процесса, но я хочу удалить data
пространство имен из вывода JSON. Я вижу, что мне нужно реализовать ArraySerializer, я прошел через документы Fractal, но не могу понять, где мне нужно добавить его в Laravel 5.2
я нашел этот ответ но я просто получаю тот же вывод в строке кода, которую я закомментировал:
class TrackController extends ApiController
{
public function index()
{
$tracks = Track::all();
//return $this->respondWithCollection($tracks, new TrackTransformer);
// Same response as the commented out line above
$response = new \League\Fractal\Resource\Collection($tracks, new TrackTransformer);
$manager = new \League\Fractal\Manager();
$manager->setSerializer(new \League\Fractal\Serializer\ArraySerializer());
return response()->json($manager->createData($response)->toArray());
}
public function show($id)
{
$track = Track::find($id);
return $this->respondWithItem($track, new TrackTransformer);
}
}
Кроме того, я реализую это на конкретном контроллере, даже если у меня это работает, где я могу добавить код / класс, чтобы я мог получить вывод ArraySerializer для всех моих контроллеров?
Я опубликовал это на Github если это поможет
Вам нужно создать собственную MySerializer
простирается от DataArraySerializer
и использовать его вместо значения по умолчанию. По умолчанию DataArraySerializer
есть три метода и в каждом из них нужно изменить возвращаемые значения на это:
use League\Fractal\Serializer\DataArraySerializer;
class MySerializer extends DataArraySerializer
{
/**
* Serialize a collection.
*
* @param string $resourceKey
* @param array $data
*
* @return array
*/
public function collection($resourceKey, array $data)
{
return $data;
}
/**
* Serialize an item.
*
* @param string $resourceKey
* @param array $data
*
* @return array
*/
public function item($resourceKey, array $data)
{
return $data;
}
/**
* Serialize null resource.
*
* @return array
*/
public function null()
{
return [];
}
}
Таким образом, вы изменяете поведение механизма сериализации и получаете результат по своему желанию.
Если вы используете spatie / Laravel-фрактальный пакет или spatie / fractalistic, тогда вы можете удалить data
ключ от результатов с помощью сериализатора массива Spatie Spatie\Fractalistic\ArraySerializer()
вместо стандартного сериализатора Fractal.
Вы можете использовать это так:
Fractal::create()
->collection($books)
->transformWith(function($book) { return ['id' => $book['id']];})
->serializeWith(new \Spatie\Fractalistic\ArraySerializer())
->toArray();
Это вернется ..
[
['id' => 1],
['id' => 2]
]
Вместо..
[
'data' => [
['id' => 1],
['id' => 2]
]
]
Или, если вы хотите использовать сериализатор Spatie глобально, добавьте его в config/fractal.php
файл как это:
<?php
return [
/*
* The default serializer to be used when performing a transformation. It
* may be left empty to use Fractal's default one. This can either be a
* string or a League\Fractal\Serializer\SerializerAbstract subclass.
*/
'default_serializer' => new Spatie\Fractalistic\ArraySerializer(),
.
.
.
];
Больше информации, см .: Использование сериализатора