我有一个控制器,用于通过cron运行进程列表,我需要它从单独的控制器运行一个方法。
当从自己的控制器调用该方法时,一切正常,但是当从cron控制器运行时(即使手动调用),它也会失败。
我的代码目前看起来像这样:
class CronController extends AppController
{
var $uses = array(.., 'EmailTemplate', ..);
var $components = array('Email');
//Some stuff
function process_for_cron_to_run() {
//Some stuff
//Run method from imported controller
App::import('Controller', 'Imported');
$imported = new ImportedController;
$imported->constructClasses();
$imported->method_to_run(); //Dies when running this method
exit;
}
}
...
class ImportedController extends AppController {
var $uses = array(..);
var $components = array('Mailer', 'RequestHandler', 'FileHandler', 'Email');
//Some stuff
function method_to_run() {
//Some stuff
$this->_sendEmail(..);
}
}
...
class AppController extends Controller
{
var $components = array('Cookie', 'RequestHandler', 'Err', 'Email', 'Sms');
var $uses = array(.., 'EmailTemplate', ..);
function _sendEmail(..) {
//Some stuff
$this->EmailTemplate->find(..); //Dying here (Line 1756)
}
..
}
这很快就会出现以下错误:
Fatal error: Call to a member function find() on a non-object in /../app/app_controller.php on line 1756
第1756行位于上面的AppController中。
我尝试将EmailTemplate
添加到ImportedController的$uses
- 这很有用,但是后来在AppController中通过调用$this->Email
而死了几行,其中包含所有三个控制器的$components
。 $this->email
的错误消息,供参考:
Fatal error: Call to a member function reset() on a non-object in /../app/app_controller.php on line 1645
我能想到的唯一另一件事是我从ImportedController调用的方法是一个admin_X,所以当我从/ processes / process_for_cron_to_run调用它时,由于身份验证问题,它可能会被淘汰?
答案 0 :(得分:-1)
我现在已经解决了这个问题;我必须采取两个步骤来解决它:
将process_for_cron_to_run()更新为initalise组件:
function process_for_cron_to_run() {
//Some stuff
App::import('Controller', 'Imported');
$imported = new ImportedController;
$imported->_initComponents(); //Added this line
$imported->constructClasses();
$imported->method_to_run();
exit;
}
它死亡的原因是因为导入的控制器没有初始化其组件;当对象在AppController中调用_sendEmail时,没有附加组件,因此它不知道$ this->电子邮件是什么。
然而,解决此问题的理想方法是将method_to_run逻辑移动到模型或组件中,而不是导入控制器。