2011-07-21 15 views
2

私はCakePHPタスクにいくつかのコンポーネントコードを用意していますが、私はコントローラを適切な方法でブートストラップしているのかどうかはわかりません。タスクでCakePHPコンポーネントを使用する場合のコード化方法

拡張されたAppController経由でアクセスすると、正常に動作する2つのコンポーネントがあります。一方のコンポーネントにはもう一方のコンポーネントが含まれているため、他方のコンポーネントにも含まれます。

最初のコンポーネント:

class BigBrotherComponent extends Object { 

    var $Controller = null; 

    var $components = array('Sibling'); 

    function startup(&$controller) { 
     $this->Controller =& $controller; 
    } 

    function doThis() { 
     $this->Controller->loadModel('SampleModel'); 
     $this->Sibling->doThat(); 
    } 
} 

第二成分:

class SiblingComponent extends Object { 

    var $Controller = null; 

    function startup(&$controller) { 
     $this->Controller =& $controller; 
    } 

    function doThat() { 
     /* Doing stuff */ 
    } 
} 

私は、コマンドラインからこれを動作させるために、私はシェルとタスクを定義します。これは仕事ですが、私はそれを正しくやっているかどうかはわかりません。 BigBrother成分がそれ自身の成分のいずれかを含む、またはBigBrother成分のコントローラオフ任意の他の構成要素を参照しない場合

App::import('Core', 'Controller'); 
App::import('Component', 'Session'); 
App::import('Component', 'BigBrother'); 

class BigBrotherTask extends Shell { 
    var $Controller; 
    var $BigBrother; 

    function initialize() { 
     $this->Controller =& new Controller(); 

     // add session to controller, because some components access $this->Controller->Session->setFlash(); 
     $this->Controller->Session =& new SessionComponent(); 
     $this->Controller->Session->startup($this->Controller); 

     // Initialise the component 
     $this->WordToText =& new WordToTextComponent(); 
     $this->WordToText->startup($this->Controller); 
    } 

    function doThat() { 
     $this->BigBrother->doThat(); 
    } 

} 

タスクのこのタイプは、うまく機能します。ご覧のとおり、私はSessionコンポーネントのためにちょっとしたことをしなければなりませんでした。

コンポーネントやサブコンポーネントを適切に初期化するために、タスクからコンポーネントを初期化して使用する方が良いでしょうか?

答えて

2

私はよりよい方法を思いついたと思いますが、それが最良の方法であるかどうかまだ分かりません。

まず、コンポーネントはinitialize()メソッドによってコントローラを設定する必要があります。これは、コントローラがコントローラまたは他のコンポーネントを介してロードされている場合に、コントローラが割り当てられることを保証する。他のコンポーネントによってロードされたコンポーネントのstartup()は実行されません。

したがって、コンポーネントは、もう少しディスパッチャが何のようなメイクコントローラとコンポーネントの初期化を行うには、以下の

function initialize(&controller, $settings = null) { 
    $this->Controller =& $controller; 
} 

次のステップを有するべきです。

App::import('Core', 'Controller'); 

class BigBrotherTask extends Shell { 
    var $Controller; 

    function initialize() { 
     $this->Controller =& new Controller(); 
     $this->Controller->components = array('Session', 'WordToText'); 
     $this->Controller->uses = null; 

     $this->Controller->constructClasses(); 
     $this->Controller->startupProcess(); 
    } 

    function doThat() { 
     $this->Controller->BigBrother->doThat(); 
    } 

} 

タスクは、あなたのコンポーネントが正常にシャットダウンを行う必要がある場合、あなたはタスク関数の最後にそれを中にコーディングする必要がありますので、その流れの一環として、シャットダウンを持っているように見える、またはしないでくださいシェルで。

関連する問題