ShellとControllerで処理を共有する

cakePHPでCronなどでタスク処理をしたい場合やコマンドライン実行をしたい場合にロジック部分を提供するShellクラスとWebアプリケーションのロジック部分を提供するController。いずれも同じロジック部分だけに、共有したいことが多い。
しかしながら、いずれもクラスはObjectから継承されたものであり、Objectクラスにゴリゴリ書かない限りは共有できないが、バージョンアップ時のメンテナンス負荷が高くなってしまう。
そしたら多重継承だ!という考えもPHPでは残念ながらできず、代わりにPHPにはinterfaceという仕組みが用意されているが、残念ながらcakePHPで使う方法がよくわからなかった(おそらくrequireするとか強引な手法であればできるはず)。
実はcakePHPにはコンポーネントという方法で対応することができる。しかし、このコンポーネントも癖があって、通常なら、
var $components = array(‘コンポート名‘);
とすれば
$this->コンポート名
で使えるようになるのだが、Shell側はそうはいかない。
App::import(‘Component’, ‘コンポート名‘);
と定義したうえで、
function startup(){
  $this->コンポート名 = new コンポート名Component();
}
を定義しなければ、Controllerと同等には使えない。
ただ標準で用意されているEmailコンポーネントなどは、上記手法を使う必要がなく、$components変数に突っ込めば使えるようになっている。もう少し調べてみる必要がありそうだ。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です