4

AJAX リクエストを介してコントローラーからシェルを実行しようとしています。

私のコントローラーで:

public function log_import() {
    $this->autoRender = false;

    App::import('Console/Command', 'AppShell');
    App::import('Console/Command', 'IzigetlogShell');

    $job = new IzigetlogShell();
    $job->dispatchMethod('main');

    echo "REPONSE";

  }

そして私のシェル:

<?php
App::import('Core', 'Controller');
App::import('Controller', 'Suivis');

class IzilogShell extends AppShell {

    public $uses = array('Suivi');

        -- DU CODE --  

          $this->Suivi = new SuivisController();
          $this->Suivi->constructClasses();


          $exist_date = $this->Suivi->find('first',
              array(
                  'conditions' => array('Suivi.date' => $date_calcul)
              ));

      }

しかし、私は常に同じエラーメッセージを受け取ります: PHP Fatal error: Call to undefined method SuivisController::find() in C:\wamp\www\iziboxLogs\app\Console\Command\IzigetlogShell.php on line XX

コンソールからシェルを実行しようとしましたが、同じエラーが発生しました。

何か案は ?ありがとう、マーティン

4

2 に答える 2

1

短い答えは次のとおりです。

これは、cake の略である MVC に違反しています。「共有」コードをモデルに移動し、このモデルを両方のケースでのみ使用する必要があります。コントローラーではありません(シェルではなく、モデルと「webbrowser」からのリンク/ロジックです)。コントローラー内のシェルではありません(シェルはモデルと「CLI」からのリンク/ロジックであるため)。

そう:

  • モデルにはすべてのコードが含まれています
  • シェルはモデルとそのメソッドを使用します
  • コントローラーはモデルとそのメソッドを使用します

=>乾いてきれい

そうすれば、単一の App::import (またはより適切な App::uses) ステートメントも必要ありません。

PS: モデル以外のコードがたくさんある場合は、APP/Lib で Lib を作成し、これを共通クラスとして使用することもできます。

PPS:public $uses = array('Suivi');とにかくモデル用であり、コントローラー用ではありません(ちなみにドキュメントの仕様として)。

于 2012-11-20T09:03:24.347 に答える
0

こうすることで

$this->Suivi = new SuivisController();

this->SuiviSuiviController になり、もはや Suivi モデルではありません。

ただし、それをモデルとして使用します。

$exist_date = $this->Suivi->find(...);

find()メソッドはモデル メソッドであり、コントローラー メソッドではありません。したがって、find()メソッドを呼び出す必要がある場合は、インスタンス化する必要はまったくありませんSuivisController

于 2012-11-20T08:50:53.950 に答える