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にあります。

ImportedControllerのに追加しようとしEmailTemplateました-これは機能しましたが、代わりに、 3つのコントローラーすべてに含まれている$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から呼び出すと、認証の問題が原因でキックアウトされる可能性がありますか?

4

1 に答える 1

-1

私は今この問題を解決しました。それを修正するために私が取らなければならなかった2つのステップがありました:

  1. ImportedControllerが参照できるように、$usesに「EmailTemplate」を追加します。これは、$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 に答える