我有一個控制器,我用它來通過cron運行進程列表,我需要它從一個單獨的控制器運行一個方法。CakePHP導入的控制器範圍問題
當從自己的控制器調用該方法時,一切正常,但從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,所以當我從/流程/ process_for_cron_to_run調用它,由於身份驗證問題它可能會被踢掉?
我已解決此問題;我不得不在process_for_cron_to_run函數中用$ imported - > _ initComponents()調用初始化組件。奇怪的是我必須這麼做,因爲'Email'已經包含在CronController的$ uses中,但它解決了這個問題。一旦我被允許,我會發佈一個適當的答案! –
如果您需要從兩個(或更多)不同的控制器執行某些代碼,那麼請參考[此帖](http://stackoverflow.com/a/12769983/727208) –
,那麼代碼需要在零件。當然,這可能會花費你幾分鐘的時間,但是你的代碼會更乾淨。 – pleasedontbelong