【问题标题】:Cakephp Custom Datasource Save/UpdateCakephp 自定义数据源保存/更新
【发布时间】:2023-03-30 21:10:01
【问题描述】:

使用最新的 CakePHP 版本 1.3.6。

我正在为外部 REST API 编写自定义数据源。我的所有读取功能都运行良好。我正在为 Model::save 和 Model::create 苦苦挣扎。

根据文档,必须实现以下方法(请参阅下文并注意它没有提到计算)。这些都实现了。但是,我收到“致命错误:调用未定义的方法 ApiSource::calculate()”。所以我实现了 ApiSource::calculate() 方法。

describe($model) listSources() 在 至少以下之一: 创建($model, $fields = array(), $values = array()) 读取($模型,$queryData = 数组()) 更新($model, $fields = array(), $values = array()) 删除($模型,$id = null)

public function calculate(&$model, $func, $params = array())
 {
  pr($model->data); // POST data
  pr($func); // count
  pr($params); // empty
  return '__'.$func; // returning __count;
 }

如果我的模特打电话

$this->save($this->data)

它正在调用计算,但没有其他实现的方法。我希望它调用 ApiSource::create() 或 ApiSource::update()

有什么想法或建议吗?

【问题讨论】:

  • 嗯,我正在使用自定义数据源,但它们没有 calculate 方法。你能做一个debug_backtrace 看看它是从哪里调用的吗?
  • 你用的是什么版本的蛋糕?根据我的阅读,这始于 1.3.2

标签: php api rest cakephp datasource


【解决方案1】:

Leo,你给了我正确的方向。答案在使用自定义数据源的模型中。该模型必须定义您的 _schema。

class User extends AppModel
{  
    public $name = 'User';

    public $useDbConfig = 'cvs';

    public $useTable = false;

    public $_schema = array(
        'firstName' => array(
            'type' => 'string',
            'length' => 30
        ),
        'lastName' => array(
            'type' => 'string',
            'length' => 30
        ),
        'email' => array(
            'type' => 'string',
            'length' => 50
        ),
        'password' =>  array(
            'type' => 'string',
            'length' => 20
        )
        );

...
}

我猜如果你在自定义数据源中实现一个 describe() 方法也可以解决问题。在这种情况下,需要对其进行预定义以授权保存和/或创建。

【讨论】:

  • 那么你在说什么 zmonteca ?通过定义模式 cake 不调用 Datasource:calculate() 方法?我正在创建数据源,我希望能够对数据进行分页,而不必在模型中创建自定义分页方法。但是,蛋糕抱怨我的数据源中没有 calculate() 方法。请为您的解决方案提供更多详细信息。
  • 实际上,我通过定义 exists() 和 _findCount() 函数来实现这一点,这似乎更符合我实际所做的(使用 API 公开数据)。另外 - 当你的数据源完成后,如果可以的话,在 github 上公开它。
  • 需要定义计算。对我来说,这有点骇人听闻。我定义了以下内容: public function calculate(&$model, $func, $params = array()) { $this->object = false;返回自我::计数;然后在我的函数 read() { } 中,当 $this->object = false 时我做了一个例外。
【解决方案2】:

来自 API:http://api13.cakephp.org/class/dbo-source#method-DboSourcecalculate

"返回一个 SQL 计算,即 COUNT() 或 MAX()"

在 ~/cake 中快速搜索可在 8 个文件中找到 20 个匹配项。其中之一是 dbo_source.php 中的定义

其他七个是:

  • dbo_source.test.php
  • code_coverage_manager.test.php
  • code_coverage_manager.php
  • dbo_db2.php
  • model.php
  • tree.php
  • containable.php

没有深入研究,我怀疑你的问题在于 Model::save

您可能必须定义一个计算方法以适应您的自定义数据源的结构,因为 Cake 不知道如何做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多