2012-07-30 24 views
0

我有一个自定义数据源,我们称之为SQSDatasource。对于find(),save(),甚至delete(),它工作正常。从数据源删除()不会立即触发find()

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->delete()之前删除$this->Job->find(),它完美的罚款。 delete()会被调用。

任何人有任何线索在这种异常?

回答

1

我已经设法找出问题所在。我的数据源代码实际上是完全实现了read(),create()等。并且所有标准的CakePHP CRUD函数都可以正常使用我的数据源。

我有问题,主要是由于这些原因:

  1. delete()在CakePHP的内部允许删除,这是我没想到

  2. 行为之前,实际上做了find('count')。当消息为正在运行的时,它暂时为隐形

  3. 此外,对于,如果不先查询它,则不能删除消息(因为删除不是通过消息ID完成的,而是通过消息处理程序完成的)。一旦你开始查询它,它就会暂时不可见,这导致CakePHP认为删除无效。

1

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

一旦你删除了查找,没有更多的错误,删除工作正常。

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

+0

感谢您回答这个问题。我大致了解问题的所在,其部分原因有两个:i)亚马逊SQS不一致; ii)我从不期望数据源在删除之前首先执行查找(“计数”)。 – uzyn 2012-07-30 18:17:03

+0

只是为了记录,数据源实际上是用'read()'等完全实现的。我在下面给这个问题添加了一个解释。谢谢。 – uzyn 2012-07-30 18:35:50