gpt4 book ai didi

php - CakePHP 导入的 Controller 作用域问题

转载 作者:行者123 更新时间:2023-12-04 16:07:03 25 4
gpt4 key购买 nike

我有一个 Controller ,我用它来通过 cron 运行进程列表,我需要它来运行来自单独 Controller 的方法。

当从它自己的 Controller 调用该方法时,一切正常,但当从 cron Controller 运行时(即使手动调用),它会失败。

我的代码目前看起来像这样:

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,包含在所有三个 Controller 的$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. 将“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;
    }

它死掉的原因是导入的 Controller 没有初始化它的组件;当该对象在 AppController 中调用 _sendEmail 时,没有任何组件附加到它,所以它不知道 $this->Email 是什么。

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

关于php - CakePHP 导入的 Controller 作用域问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12946753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com