CakePHP 3 中的 REST 客户端模型

REST client model in CakePHP 3

我正在开发一个 Cake 应用程序,它可以从数据库和第三方 REST API 中提取数据。我想为我尝试访问的各种 REST 集合使用模型正确地实现 REST API(从单个行为继承),但是如果没有相应的数据库我就无法使我的模型工作 table。我最初的计划是创建 class Software extends Cake\ORM\Entityclass SoftwaresTable extends Cake\ORM\Table,然后使用 before* 挂钩覆盖各种调用并将它们重新路由到 API 而不是数据库。

但是,我已将 die() 添加到 beforeMarshalbeforeRulesbeforeFindbeforeSavebeforeDelete,并调用来自控制器的 $this->Softwares->all() 仍然失败并显示消息

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'inventory.softwares' doesn't exist

我的做法有错吗?我缺少一些简单的东西?

查看 CakePHP 3 的源代码,模型似乎耦合到数据库数据源。

在 CakePHP 2.x 中,您可以定义自己的数据源,因此可以轻松地将其交换为由外部 API 提供,而不是数据库,但我看不到乍一看该功能(使用 CakePHP 3 的人比我多的人可能会有不同的看法)。

这么说,还有一个EntityTrait。您最好创建自己的 类 来代表每个实体,然后将该特征添加到您的 类。例如:

<?php
namespace App\Model;

use Cake\Datasource\EntityTrait;

class Software {

    use EntityTrait;

}

如果您不想让数据库支持您的模型table,请不要使用Cake\ORM\Table。而是制作你自己的基础模型 class 来实现 Cake\Datasource\RepositoryInterface。然后让你的模型扩展这个基础 class。

这不是一项微不足道的任务,但比您尝试破解 Table class' 回调以防止它们连接到数据库的替代方案要好。