尝试通过在Laravel 5.2中实现ArraySerializer来删除Fractal中的数据


Trying to remove data in Fractal by implementing ArraySerializer in Laravel 5.2

我已经让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上发布了这篇文章。

您需要创建自己的DataArraySerializerMySerializer扩展并使用它而不是默认值。默认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(),
    .
    .
    .
];

更多信息,请参阅:使用序列化程序