我有一个自定义数据源,我们称之为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
的模型,SQSDatasource
。 Job
中没有非凡的逻辑。
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()
会被调用。
任何人对此异常都有任何线索吗?
答案 0 :(得分:1)
您没有任何执行查找的代码,例如数据源中定义的read()函数。我怀疑在那里发现它失败了,因此没有删除。
删除查找后,不再有错误,删除工作正常。
查看datasources的文档,并确保已启用调试。可能会检查日志中是否有任何未显示的错误。
答案 1 :(得分:1)
我设法找出问题所在。我的数据源代码实际上已经完成了read()
,create()
等的完整实现。所有标准的CakePHP CRUD函数都适用于我的数据源。
我遇到的问题主要是由于以下原因:
delete()
实际上在允许删除之前在内部执行了find('count')
,这是我没想到的
amazon-sqs的行为。当消息正在进行中时,它暂时不可见。
此外,对于amazon-sqs,您无法在未先查询消息的情况下删除消息(因为删除不是通过消息ID完成的,而是通过消息处理程序完成的)。一旦你开始查询它,它就会暂时变得不可见,这导致CakePHP认为删除无效。