Почему мои страницы не отображаются после использования ресурса для отображения моих данных?

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

Выход https://i.s tack.imgur.com/SC2uf.png

В моем контроллере

   $All = Customers::with('order')->paginate(10);

    return response()->json([
        'code' => 0,
        'success' => true,
        'data' => $All,

    ], 200);

Но сразу после того, как я использую ресурсы для отображения данных

  $All = Customers::with('order')->paginate(10);

    return response()->json([
        'code' => 0,
        'success' => true,
        'data' => DataResource::collection($All),

    ], 200);

Нумерация страниц исчезла

DataResource

   public function toArray($request)
    {
        //return parent::toArray($request);
        return [
            'name' => $this->name,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
            'order' => Resources::collection($this->order)

        ];
    }

2 ответа

Похоже, вы используете Eloquent: API Resources, хотя неясно, какая версия Laravel используется, потому что более новая версия демонстрирует совершенно другую нумерацию страниц.

Когда я показываю dump() первого фрагмента, paginator (также называемый LengthAwarePaginator объект) находится в корне ответа:

LengthAwarePaginator {#406 ▼
  #total: 3
  #lastPage: 1
  #items: Collection {#401 ▶}
  #perPage: 10
  #currentPage: 1
  #path: "http://laravelsoplayground"
  #query: []
  #fragment: null
  #pageName: "page"
  +onEachSide: 3
  #options: array:2 [▶]
}

После того, как ресурсы были применены, paginator все еще присутствует, но был перемещен в resource приписывать.

AnonymousResourceCollection {#331 ▼
  +collects: "App\Http\Resources\DataResource"
  +collection: Collection {#214 ▶}
  +resource: LengthAwarePaginator {#406 ▶}
  +with: []
  +additional: []
}

У меня была такая же проблема, и я был сбит с толку, потому что в документации написано:

Вы можете передать экземпляр разбиения на страницы Laravel методу сбора ресурса или пользовательской коллекции ресурсов... Ответы с разбивкой на страницы всегда содержат мета-ключи и ключи ссылок с информацией о состоянии разбиения на страницы ( документация Laravel 6).

Проблема в том, что эти объекты ресурсов предназначены для прямого возврата, а не для включения в более крупный ответ JSON. Мои мысли о том , почему это происходит, смотрите здесь .

Есть два способа решить эту проблему.

Решение 1. Устраните отправку метаданных вместе с ответом (поля «код» и «успех»). Это несколько избыточно, поскольку при возврате ресурса JSON он будет отправлен с HTTP-ответом, статус которого равен200 OK. Код, использующий ваш API, должен иметь возможность анализировать как статус, так и сообщение о состоянии. Функция вашего контроллера теперь будет выглядеть так:

      public function index()
{
    return new DataResource::collection(Customers::with('order')->paginate(10))
}

Решение 2. Если потребители вашего API полностью полагаются на отправляемые вами метаданные, у Laravel есть решение для этой проблемы. Laravel предоставляетResourceCollectionкласс, который может включать произвольные метаданные.

В то время как ресурсы преобразуют одну модель в массив, коллекции ресурсов преобразуют коллекцию моделей в массив. Нет абсолютной необходимости определять класс коллекции ресурсов для каждого типа модели, поскольку все ресурсы предоставляют метод сбора для создания «специальной» коллекции ресурсов «на лету». Однако если вам необходимо настроить метаданные, возвращаемые вместе с коллекцией, необходимо будет определить коллекцию ресурсов.

Начните с изменения вашегоDataResourceрасширитьIlluminate\Http\Resources\Json\ResourceCollectionвместоIlluminate\Http\Resources\Json\Resource. Затем вы можете добавить метаданные в ответ любым из трех способов. 1) Добавив его в массив, возвращаемый функциейtoArray()функция. 2) Определениеwith()функция на ресурсе коллекции, которая вызывается, когда ресурс возвращается из функции контроллера. Или 3) добавить его к ресурсу при создании коллекции (см. документацию). Я собираюсь показать вариант 2, потому что он вызывается только тогда, когда коллекция возвращается как самый внешний ресурс.

Ресурс

      use Illuminate\Http\Resources\Json\ResourceCollection;

class DataCollection extends ResourceCollection
{
    public function toArray($request)
    {
        return [
            'name' => $this->name,
            'created_at' => $this->created_at,
            'updated_at' => $this->updated_at,
            'order' => Resources::collection($this->order)
        ];
    }

    public function with($request)
        {
            return [
                'meta' => [
                    'success' => 'true',
                    'code' => 0,
                ],
            ];
        }

Контроллер

      use App\Http\Resources\DataCollection;

public function index()
{
    return new DataCollection(Customers::with('order')->paginate(10));
}

Переименование ресурса не является обязательным, но соответствует соглашению. Мета-теги, которые вы определите, будут объединены с мета-тегами, созданными средством разбиения на страницы.

Эта функциональность существует по крайней мере начиная с Laravel 6.X. При необходимости проверьте документацию на предмет более ранней совместимости.

Другие вопросы по тегам