как убрать объект данных из ответа, поступающего из библиотеки фрактола laravel? - PullRequest
0 голосов
/ 01 мая 2019

Я получаю данные как объект в ответ из фрактальной библиотеки laravel по умолчанию для всех API.

Вместо данных мне не нужны данные. Вместо данных мне нужно произвольное имя, но я не могу этого сделать.

Как настроить код из фрактальной библиотеки, чтобы получить элемент вместо данных.

1 Ответ

0 голосов
/ 01 мая 2019

Создать DataSerializer Класс:

namespace App\{Your Project Name}\Serializers;

use League\Fractal\Serializer\ArraySerializer;

class DataSerializer extends ArraySerializer
{
    public function collection($resourceKey, array $data)
    {
        if ($resourceKey) {
            return [$resourceKey => $data];
        }

        return $data;
    }
    public function item($resourceKey, array $data)
    {
        if ($resourceKey) {
            return [$resourceKey => $data];
        }
        return $data;
    }
}

Добавить setResponseData функцию в базовом контроллере:

public function setResponseData($default=true, $data, $transformer, $includes = null){

    if($default){
        $resource = fractal($data, $transformer);

        if($includes){
            $resource->parseIncludes($includes);
        }
        return $resource;
    }

    $resource = null;
    if($data instanceof LengthAwarePaginator){
        $dataCollection = $data->getCollection();
        $resource = new Collection($dataCollection, $transformer, 'data');
        $resource->setPaginator(new IlluminatePaginatorAdapter($data));
    } elseif($data instanceof \Illuminate\Database\Eloquent\Collection){
        $resource = new Collection($data, $transformer, 'data');
    } elseif($data instanceof Model){
        $resource = new Item($data, $transformer, 'data');
    } else{
        return [];
    }

    $manager = new Manager();
    $manager->setSerializer(new DataSerializer());

    if($includes){
        $manager->parseIncludes($includes);
    }

    $content = [];
    if($resource){
        $content = $manager->createData($resource)->toArray();
    }

    return $content;
}

Вызвать setResponseData функцию из вашего производного контроллера:

$response = $this->setResponseData(false, $data, new YourTransformer(), ['include-1']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...