我正在尝试通过AJAX请求从我的控制器执行 Shell。
在我的控制器中:
public function log_import() {
$this->autoRender = false;
App::import('Console/Command', 'AppShell');
App::import('Console/Command', 'IzigetlogShell');
$job = new IzigetlogShell();
$job->dispatchMethod('main');
echo "REPONSE";
}
我的外壳:
<?php
App::import('Core', 'Controller');
App::import('Controller', 'Suivis');
class IzilogShell extends AppShell {
public $uses = array('Suivi');
-- DU CODE --
$this->Suivi = new SuivisController();
$this->Suivi->constructClasses();
$exist_date = $this->Suivi->find('first',
array(
'conditions' => array('Suivi.date' => $date_calcul)
));
}
但我总是得到相同的错误消息: PHP致命错误:在第XX行的C:\ wamp \ www \ iziboxLogs \ app \ Console \ Command \ IzigetlogShell.php中调用未定义的方法SuivisController :: find()
我试图从控制台执行shell,我也遇到了同样的错误。
有什么想法吗?谢谢,马丁
答案 0 :(得分:2)
简短的回答是:你没有!
它违反了MVC蛋糕所代表的含义。 您需要将“共享”代码移动到模型中,并仅在两种情况下使用此模型。不是控制器(来自模型和“webbrowser”的链接/逻辑,而不是你的shell)。而不是控制器内的shell(因为shell是模型和“CLI”的链接/逻辑)。
所以:
=&GT;干燥和清洁
那么你也不需要一个App :: import(或更好的App :: uses)语句。
PS:如果您碰巧有很多非模型代码,您也可以在APP / Lib中创建一个Lib,并将其作为您的公共类。
PPS:public $uses = array('Suivi');
无论如何都适用于模型,不适用于控制器(顺便说一下,文档也是如此)。
答案 1 :(得分:0)
通过这样做
$this->Suivi = new SuivisController();
this->Suivi
成为SuiviController,而不再是Suivi模型。
但是你将它用作模型:
$exist_date = $this->Suivi->find(...);
find()
方法是模型方法,而不是控制器方法。因此,如果您确实需要调用find()
方法,则根本不需要实现SuivisController
。