CakePHP如何从API JSON数据源创建分页

问题描述

我有一个类似example的API

我已使用CakePHP HTTP客户端获取数据,低于我尝试的代码

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 '));
} 

我正在尝试对该国家/地区数据应用分页,然后将其与分页一起获取。 经过上面的代码尝试,我得到了下面的错误

传递给Cake \ Datasource \ Paginator :: extractData()的参数1必须是Cake \ Datasource \ RepositoryInterface的实例,是指定的Cake \ Http \ Client \ Response的实例,在\ myapp \ vendor \ cakePHP调用第176行上的\ cakePHP \ src \ Datasource \ Paginator.PHP

我如何得到我想要的结果?

解决方法

您可能需要实现一个扩展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。

,

默认分页仅支持查询表(存储库)或对预构建的查询实例进行操作。

要在 @Zeppi's answer 上扩展。基本上,这里有三个简单的选项:

  1. 创建@Zeppi提示的自定义查询/存储库实现。

    这确实可以做很多工作,因此您可能希望研究借助插件的替代实现,例如 muffin/webservice ,它可以完成大多数实施所需接口的艰苦工作。

  2. 或创建一个实际上接受并处理数组数据的custom paginator

  3. 或使用广为人知的“数据表”,即在前端中用于分页数据的基于JavaScript的表,例如 jQuery DataTables

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...