我已经让API使用标准流程,但我想从JSON输出中删除data
名称空间。我知道我需要实现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上发布了这篇文章。
您需要创建自己的DataArraySerializer
的MySerializer
扩展并使用它而不是默认值。默认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/laraavel分形包或spatie/fractistic,则可以使用spatie数组序列化程序Spatie'Fractalistic'ArraySerializer()
而不是fractal的默认序列化程序从结果中删除data
键。
你可以这样使用:
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(),
.
.
.
];
更多信息,请参阅:使用序列化程序