CakePHP导入控制器范围问题

时间:2012-10-18 03:45:25

标签: php cakephp

我有一个控制器,用于通过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调用它时,由于身份验证问题,它可能会被淘汰?

1 个答案:

答案 0 :(得分:-1)

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

  1. 将'EmailTemplate'添加到$ uses,以便ImportedController可以引用它。这意味着代码现在在尝试调用$ this->电子邮件时死亡。
  2. 将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;
    }
    
  3. 它死亡的原因是因为导入的控制器没有初始化其组件;当对象在AppController中调用_sendEmail时,没有附加组件,因此它不知道$ this->电子邮件是什么。

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