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

Jac*_*ham 7 php serialization transformer-model jsonserializer laravel

我已经使用标准进程工作了API,但我想data从JSON输出中删除命名空间.我看到我需要实现ArraySerializer,我已经完成了分形文档,但我无法找到我需要在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,我在一个特定的控制器上实现它,即使我有这个工作,我在哪里添加代码/类,以便我可以获得所有控制器的ArraySerializer输出?

如果有帮助的话,我已经在Github上发布了这个.

Sta*_*lav 5

您需要创建自己的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 [];
    }

}
Run Code Online (Sandbox Code Playgroud)

因此,您可以更改序列化机制的行为并根据需要获得结果。