2011-04-10 47 views
2

我有一个CakePHP Console Shell,它工作正常,直到Model->afterFind()尝试向包含添加链接的结果添加一些数据,这些数据在从控制台调用时似乎不起作用。如何测试是否从CakePHP控制台运行?

有没有办法在Model->afterFind()回调函数中测试它是否从Console Shell调用,这样我就可以跳过我不需要的麻烦部分了?

感谢, 伊恩

回答

3

我也不太清楚是否有一个蛋糕的方式来做到这一点,但你可以通过普通的PHP做

if(php_sapi_name() == 'cli' && empty(getClientIP())) { 
     //running via CLI 
} else { 
     //running normally 
} 
+0

使用'php_sapi_name()'来测试我们是否通过cli运行会有效,特别是如果封装在AppModel函数中用于重用和优化。然而,最终我发现我可以通过收紧触发问题的查找(从查询中删除特定字段)来阻止错误发生,以便由于其他测试已经存在而导致导致问题的部分从未输入。 – ianmjones 2011-04-11 09:01:09

+0

永远不止一种方式来皮肤猫:) – JohnP 2011-04-11 09:53:04

1

在我看来,你是如果您的业务(模型)层在不同环境下运行时产生不利影响,则可以打破MVC最佳实践。无论你将什么放入Model-> afterFind()都应该完全不知道应用程序的执行方式。

有了这样的理解,CakePHP的模型层根本不知道执行上下文。一种解决方案是通过向shell中的模型层传递一个标志来解决这个问题。即:

在app_model.php的顶部:

var $isShellContext = false; 

然后,在你的shell:

$this->Model->isShellContext = true; 

然后在型号 - >一个afterFind():

if(!$this->isShellContext) { 
    // add links, etc 
} 
相关问题