CakePHP Как создать пагинацию из источника данных API JSON

У меня есть API, например пример

Я использовал HTTP-клиент cakephp для получения данных, ниже моего кода попытки

public index()
{
    $http = new Client();
    $response = $http->get('https://restcountries.eu/rest/v2/all');
    // $json = $response->getJson();  //also tried usgin json
    $countries = $this->paginate($response);
    $this->set(compact('countries '));
} 

Я пытаюсь применить разбиение на страницы с данными этой страны, а затем получить их с помощью разбивки на страницы. После попытки кода выше я получил ошибку ниже

Аргумент 1, переданный в Cake \ Datasource \ Paginator :: extractData (), должен быть экземпляром Cake \ Datasource \ RepositoryInterface, экземпляром данного Cake \ Http \ Client \ Response, который вызывается в \ myapp \ vendor \ cakephp \ cakephp \ src \ Datasource \ Paginator.php в строке 176

Как я могу получить результат своего желания?


person Satu Sultana    schedule 02.09.2020    source источник


Ответы (2)


Вероятно, вам нужно реализовать класс, расширяющий RepositoryInterface.

class JsonSource implements Cake\Datasource\RepositoryInterface 
{ ... }

public index() {
  $http = new Client();
  $response = $http->get('https://restcountries.eu/rest/v2/all');

  $src = new JsonSource();
  $src->fromResponse($response);

  $countries = $this->paginate($src);
  $this->set(compact('countries ')); }

Это немного утомительно, потому что вам нужно определить Json как источник данных.

person Zeppi    schedule 02.09.2020

Пагинация по умолчанию поддерживает только запросы к таблицам (репозиториям) или работу с предварительно созданными экземплярами запросов.

Чтобы продолжить, @ Zeppi answer. В основном у вас есть три довольно простых варианта:

  1. Создавайте собственные реализации запросов / репозиториев, как намекает @Zeppi.

    Это действительно может потребовать много работы, поэтому вы можете изучить альтернативную реализацию этого с помощью плагинов, например muffin / webservice, который выполняет большую часть тяжелой работы по реализации требуемых интерфейсов.

  2. Или создайте пользовательский пагинатор. , который действительно принимает данные массива и работает с ними.

  3. Или используйте то, что широко известно как таблица данных, то есть таблица на основе JavaScript во внешнем интерфейсе, которая разбивает данные на страницы, например jQuery Таблицы данных.

person ndm    schedule 02.09.2020