如何测试是否从CakePHP控制台运行?

如何测试是否从CakePHP控制台运行?,php,cakephp,Php,Cakephp,我有一个CakePHP控制台Shell,它可以正常工作,直到Model->afterFind()尝试向结果中添加一些数据,包括添加链接,而从控制台调用时,这些链接似乎不起作用 有没有办法在Model->afterFind()回调函数中测试它是否是从控制台Shell调用的,这样我就可以跳过我不需要的麻烦部分 谢谢, Ian我不太确定是否有一种简单的方法可以做到这一点,但你可以通过普通的PHP来实现 if(php_sapi_name() == 'cli' && empty(getC

我有一个CakePHP控制台Shell,它可以正常工作,直到
Model->afterFind()
尝试向结果中添加一些数据,包括添加链接,而从控制台调用时,这些链接似乎不起作用

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

谢谢,
Ian

我不太确定是否有一种简单的方法可以做到这一点,但你可以通过普通的PHP来实现

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

在我看来,如果您的业务(模型)层在不同环境中运行时产生了不利影响,那么您就违反了MVC最佳实践。无论您在Model->afterFind()中输入什么,都应该完全不知道应用程序是如何执行的

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

在app_model.php的顶部:

var $isShellContext = false;
然后,在您的shell中:

$this->Model->isShellContext = true;
然后在Model->afterFind()中:


使用
php\u sapi\u name()。但是,最后我发现,我可以通过收紧触发问题的查找(从查询中删除特定字段)来阻止错误的发生,这样导致问题的部分就不会被输入,因为其他测试已经到位。剥猫皮的方法总是不止一种:)
if(!$this->isShellContext) {
   // add links, etc
}