CakePHPでコンソールアプリを作る

PHPでコマンドランの簡単な処理を作ることになったので、せっかくなのでCakePHPのShellを使ってみました。
ブログなどでの取り上げも少ないようなのでちょっと覚書的に書いておこうと思います。
使い方は非常に簡単で、/app/vendors/shells/ に、test.php のような名前でファイルを作ります。
このファイルの中身は、Shellクラスをオーバーライドしたものとします。
例えばこんな感じです。

<?php
class TestShell extends Shell{
	private $_str = array(
			'construct' => 'コンストラクト',
			'initialize' => '初期化処理',
			'startup' => '開始処理',
			'main' => '基本処理',
			'choise' => '選択してください',
			'suspend' => '中止されました',
			'openFile' => 'ファイルを開いて表示します。パスを入力してください。:'
		);

	function initialize(){
		mb_convert_variables('SJIS', 'UTF-8', $this->_str);
		$this->out($this->_str['initialize']);
	}
	function startup(){
		$this->out($this->_str['startup']);
	}
	function main(){
		if($this->in($this->_str['choise'], array('y','q'), 'y') == 'q'){
			$this->error('line:'.__LINE__.' on '.__FILE__, $this->_str['suspend']);
		}else{
			$this->hr(1);
			$this->out($this->_str['main']);
			$this->hr(1);
			$input = $this->in($this->_str['openFile']);
			echo file_get_contents($input);
		}
	}
}
?>

コマンドラインからのアクセスには、

cake シェルのクラス名 メソッド名 引数1 引数2,,,,

のようになります。メソッド名を省略すると、mainメソッドが呼ばれます。
一番最初の cake は /cake/console/ 配下にあるコマンドなので、あらかじめ /cake/console を環境変数に入れておいた方が使いやすいでしょう。
その上で、APPのディレクトリに移動して上記のようにコマンドをたたきます。
また、別の方法として

cake -app APPへのパス シェルのクラス名 メソッド名 引数1 引数2,,,,

のように明示的に指定すると、どこからでもアクセスできます。

Shellクラスにはコンポーネントと同様に、startup, initialize 等のコールバックメソッドが用意されていますので、初期化処理や定型処理を書いておくのもいいかもしれません。
また、コントローラと同様に、$uses メンバ変数で使用するモデルを指定できるので、コントローラで行う処理と同じ感覚でモデルのデータにアクセスできます。

Windowsのコマンドラインから使用する場合、文字コードがSJISになるので、今回は上記のように、メンバ変数に使用するメッセージ文言を定義しましたが、CakePHPのLocale機能を使って、

$this->in(__get('openFile'));

のようにするとより綺麗かも知れません。

Leave a Comment

NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

getting health insurance in new york buy clomid online UK major health insurance companies buy levitra uk online what are wells fargo hours buy finasteride affordable health insurance for children accutane no prescription medical center of trinity viagra online uten resept midwestern university wellness center dapoxetine top individual health insurance companies viagra ireland