3

我有一个控制器,用于通过 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$usesImportedController - 这有效,但它在 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 调用它时,它可能会因为身份验证问题而被踢出?

4

1 回答 1

-1

我现在已经解决了这个问题;我必须采取两个步骤来修复它:

  1. 将“EmailTemplate”添加到 $uses 以便 ImportedController 可以引用它。这意味着代码现在在尝试调用 $this->Email 时会死掉。
  2. 更新了 process_for_cron_to_run() 以初始化组件:

    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->Email 是什么。

然而,这个问题的理想解决方案是将 method_to_run 逻辑移动到模型或组件中,而不是导入控制器。

于 2012-10-18T22:10:51.843 回答