Shell」カテゴリーアーカイブ

CakephpのShellでComponentを使う

普通のComponentを使う場合は、「PHPで作る携帯サイト」本とかWEB上にも載っていた。

そのComponentが別のComponentを使用している場合では、実行時にObjectがないって怒られてしまう。

どうしていいのか検討がつかなかったので、masapさんに相談してみたときのメモ。
masapさんに感謝。

通常の場合

App::import('Component', 'コンポーネント名');
class HogeShell extends Shell{
    public $uses = array(モデル);
    function startup{
        $this->コンポーネント名 = new コンポーネント名Component($this);
    }

    function main(){
        // メインの処理
    }
}

通常であればのこれでOK。

Componentに依存関係がある場合

具体的には、Componentがさらに別のComponentを使っている場合です。

ContollerをnewしてconstructClasses()、そしてControllerがもっているCompontを使います。

 

constructClasses()は階層も含めてusesとcomponentをつくってくれるそうです。

 

作りながら気づいていたのですが、専用のControllerをつくったほうがよさそうです。。
App::import('Core', 'Controller');
App::import('Controller', 'App');
class HogeShell extends Shell{
    public $uses = array(モデル);
    function startup{
		$this->controller = new AppController();
		$this->controller->components = array('Example');
		$this->controller->constructClasses();
		$this->Example = $this->controller->Example;
    }

    function main(){
        // メインの処理
         $this->Example->hogehoge();
    }
}

以下のようにした方がいいかもしれません。
確認はしていませんが。。

class HogeController extends AppController{
 public $components = array('Example');
}
App::import('Core', 'Controller');
App::import('Controller', 'Hoge');
class HogeShell extends Shell{
    public $uses = array(モデル);
    function startup{
        $this->controller = new HogeController();
        $this->controller->constructClasses();
        $this->Example = $this->controller->Example;
    }

    function main(){
        // メインの処理
        $this->Example->hogehoge();
    }
}

。。。