find()后,数据源中的delete()不会立即触发

时间:2012-07-30 18:03:39

标签: cakephp amazon-sqs

我有一个自定义数据源,我们称之为SQSDatasource。一般情况下,它适用于find()save()甚至delete()

class SQSDatasource extends DataSource {
    public function delete(Model $Model, $conditions = null) {

        // Deliberate break point to ensure that this function is being called
        print_r($conditions);
        exit();

        // I have my proper delete logic here, which works fine usually
    }
}

使用Job的模型,SQSDatasourceJob中没有非凡的逻辑。

但是,我遇到了一个奇怪的异常现象。

class TestShell extends AppShell {
    public $uses = array('Job');

    public function main() {
        // This works fine.
        $job = $this->Job->find('first');

        // The break point never gets called
        $this->Job->delete('TEST!');

        // This gets called
        $this->out('This gets called.');
    }
}

但是,如果我在调用$this->Job->find()之前删除$this->Job->delete(),那么它的效果非常好。 delete()会被调用。

任何人对此异常都有任何线索吗?

2 个答案:

答案 0 :(得分:1)

您没有任何执行查找的代码,例如数据源中定义的read()函数。我怀疑在那里发现它失败了,因此没有删除。

删除查找后,不再有错误,删除工作正常。

查看datasources的文档,并确保已启用调试。可能会检查日志中是否有任何未显示的错误。

答案 1 :(得分:1)

我设法找出问题所在。我的数据源代码实际上已经完成了read()create()等的完整实现。所有标准的CakePHP CRUD函数都适用于我的数据源。

我遇到的问题主要是由于以下原因:

    CakePHP中的
  1. delete()实际上在允许删除之前在内部执行了find('count'),这是我没想到的

  2. 的行为。当消息正在进行中时,它暂时不可见

  3. 此外,对于,您无法在未先查询消息的情况下删除消息(因为删除不是通过消息ID完成的,而是通过消息处理程序完成的)。一旦你开始查询它,它就会暂时变得不可见,这导致CakePHP认为删除无效。