Как разбить результат HTTP-ответа с помощью laravel livewire

Я хочу заполнить таблицу вызовом HTTP-запроса и получить штраф JSON, я настроил живой провод, подобный этому, который может правильно заполнить таблицу:

  public function render()
{
    $this->response = Http::timeout(30)->get('http://127.0.0.1:8000/api/lines')->body();


    return view('livewire.line-index', ['lines' =>json_decode($this->response)])->layout('layouts.app', ['header' => 'Line Management']);
}

но когда я добавляю paginate вот так:

  public function render()
{
    $this->response = Http::timeout(30)->get('http://127.0.0.1:8000/api/lines')->body();


    return view('livewire.line-index', ['lines' =>json_decode($this->response)->paginate(25)])->layout('layouts.app', ['header' => 'Line Management']);
}

Я вижу эту ошибку:

Call to a member function paginate() on array

person sohrab saboori    schedule 15.12.2020    source источник
comment
paginate() должен вызываться в экземпляре построителя запросов, а не в чем-либо. Вы можете создать макрос для разбиения на страницы в коллекции, а затем просто преобразовать ответ в коллекцию, прежде чем разбивать ее на страницы.   -  person Qirel    schedule 15.12.2020
comment
@Qirel Я конвертирую его в коллекцию, но все еще не могу разбить коллекцию на страницы $collection = collect(json_decode($this->response)); return view('livewire.line-index', ['lines' =>$collection->paginate(25)])->layout('layouts.app', ['header' => 'Line Management']);, но все еще вижу это Method Illuminate\Support\Collection::paginate does not exist.   -  person sohrab saboori    schedule 15.12.2020
comment
... но для этого вам нужно создать макрос, который разбивает коллекцию на страницы, как я уже сказал.   -  person Qirel    schedule 15.12.2020
comment
@Qirel Спасибо. здесь он работает как справочник, как создать макрос https://gist.github.com/simonhamp/549e8821946e2c40a617c85d2cf5af5e   -  person sohrab saboori    schedule 15.12.2020


Ответы (1)


Решение: необходимо преобразовать массив в коллекцию, а затем создать макрос для использования разбивки на страницы на

collection.
 public function render()
    {
        $this->response = Http::timeout(30)->get('http://127.0.0.1:8000/api/lines')->body();

        $collection = collect(json_decode($this->response));
     
        return view('livewire.line-index', ['lines' =>$collection->paginate(20)])->layout('layouts.app', ['header' => 'Line Management']);
    }

Для создания макроса необходимо обновить файл AppServiceProvider.php:

<?php

namespace App\Providers;

use Illuminate\Support\Collection;
use Illuminate\Pagination\LengthAwarePaginator;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        /**
         * Paginate a standard Laravel Collection.
         *
         * @param int $perPage
         * @param int $total
         * @param int $page
         * @param string $pageName
         * @return array
         */
        Collection::macro('paginate', function($perPage, $total = null, $page = null, $pageName = 'page') {
            $page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);

            return new LengthAwarePaginator(
                $this->forPage($page, $perPage),
                $total ?: $this->count(),
                $perPage,
                $page,
                [
                    'path' => LengthAwarePaginator::resolveCurrentPath(),
                    'pageName' => $pageName,
                ]
            );
        });
    }
}

Ссылка: https://gist.github.com/simonhamp/549e8821946e2c40ac617caf85d

person sohrab saboori    schedule 15.12.2020