CakePHP のコンソール系のアプリケーションは何かと便利で、しかも驚くほど簡単にできてしまいます。(以下 CakePHP v2.2.1 において)

関連する情報など

公式の解説は一応この辺りにあります

ファイルの作成とデフォルトのアクション( main メソッド )

まずAppShell を継承する class MyShell を、MyShell.php という名前で APP/Console/Command/MyShell.php として保存。

<?php
/**
 * APP/Console/Command/MyShell.php
 */
class MyShell extends AppShell {
}

MyShell::main() を記述すれば最低限のことは出来ます。

class MyShell extends AppShell {
	public function main() {
		echo "Hello world!\n";
	}
}

できれば echo の代わりに Shell::out( ‘message’ ) を使いましょう。

class MyShell extends AppShell {
	public function main() {
		$this -> out( "Hello world!" );
	}
}

コンソールを起動し APP ディレクトリ(以下の画面では*******とします)へ移動して Console/cake my とすれば、MyShell::main() が実行されます。※ php にパスが通っている必要があります

*******>Console\cake my

Welcome to CakePHP v2.2.1 Console
-------------------------------------------------
App : app
Path: *******
-------------------------------------------------
Hello world!

アクションにコマンドから引数を渡す

スペース区切りでパラメータをいくつでも渡すこともできます。※パラメータは $this -> args の配列に格納されています

class MyShell extends AppShell {
	public function main() {
		var_dump( $this -> args );
	}
}
*******>Console\cake my 1234567 abcdefg

Welcome to CakePHP v2.2.1 Console
-------------------------------------------------
App : app
Path: *******
-------------------------------------------------
array(2) {
  [0]=>
  string(7) "1234567"
  [1]=>
  string(7) "abcdefg"
}

ただしパラメータ文字の先頭に – (ハイフン)をつけると特殊なオプションとみなされるためメソッドの実行に支障をきたす場合があります。

*******>Console\cake my 123 -abc

Usage:
cake my [-h][-v][-q]

Options:

--help, -h    Display this help.
--verbose, -v Enable verbose output.
--quiet, -q   Enable quiet output.

アクションを追加する

先頭のパラメータと同じ名前のメソッドがあれば、 その名前のメソッドが実行されます。もちろんパラメータも渡せます。※ main は実行されません。

class MyShell extends AppShell {
	public function main() {
		$this -> out( "Hello world!" );
		var_dump( $this -> args );
	}

	public function myMethod() {
		$this -> out( "You called 'myMethod'" );
		var_dump( $this -> args );
	}
}
*******>Console\cake my myMethod myArg

Welcome to CakePHP v2.2.1 Console
-------------------------------------------------
App : app
Path: *******
-------------------------------------------------
You called 'myMethod'
array(1) {
  [0]=>
  string(5) "myArg"
}

標準入力から値を取得する

$this -> stdin -> read() によって、標準入力を取得できます。

class MyShell extends AppShell {
	public function myRead() {
		$this -> out( "You input '" . $this -> stdin -> read() . "'." );
	}
}

上記サンプルの場合、cake my myRead と入力すると CakePHP のプロセスに入ります。そこで例えば’hello’と入力するとこうなります。

*******>Console\cake my myRead

Welcome to CakePHP v2.2.1 Console
-------------------------------------------------
App : app
Path: *******
-------------------------------------------------
hello
You input 'hello'.

$this -> in( ‘Message’ ) とすることで入力前のメッセージを出力した上で標準入力を取得できます。Bake の対話式コマンドなどもこの機能を用いています。※第2引数に選択肢、第3引数にデフォルト値も設定できて便利です。

class MyShell extends AppShell {
	public function myInput() {
		$this -> out( $this -> in( 'Press enter key after input something ...' ) );
	}
}
*******>Console\cake my myInput

Welcome to CakePHP v2.2.1 Console
-------------------------------------------------
App : app
Path: *******
-------------------------------------------------
Press enter key after input something ...
Yes, I do.
Yes, I do.

対話式コンソールアプリの単純なサンプル

なので、こんな感じで対話式のコンソールアプリが簡単に作れます。

class MyShell extends AppShell {
	public function login() {
		$this -> out( "What is your name?" );

		do{ 
			$name = trim( $this -> in( 'Name:' ) );
		} while ( $name === '' );

		$this -> out( "Hi " . $name . ", tell me your password." );

		while( "" !== $password = $this -> in( 'Password:' ) ) {
			if( $password === 'hoge' ) {
				$this -> out( "You have successfully logged in!" );
				return;
			} else {
				$this -> out( "Fault..." );
				continue;
			}

		}

		$this -> out( "Good bye ". $name ." !" );
	}

}
*******>Console\cake my

Welcome to CakePHP v2.2.1 Console
-------------------------------------------------
App : app
Path: *******
-------------------------------------------------
What is your name?
Name:
zuborawka
Hi zuborawka, tell me your password.
Password:
123
Fault...
Password:
hoge
You have successfully logged in!

Model の参照などは Controller 的な実装がそのまま適用できるものが多いです。

class MyShell extends Shell {
    public $uses = array('Post', 'Comment');
}

このほか BakeShell を参考にすると基本機能の使い方など様々な発見があると思います。

またよければこちらも参考にして下さい。
CakePHP 2.x で Cron を使う

興味を持たれた方はどうぞお試しあれ。


おまけで補足的リファレンス

function in( $message, $options = null, $default = null ) {} の第2引数について

この第2引数により入力を任意の候補に制限できます。文字列の配列を渡した場合、その配列の要素以外の入力を受け付けなくなります。また、配列ではなく文字列を渡すこともできるのですが、その場合どう扱われるかというと、

[1]:’,'(カンマ)を含んでいる場合、’,'(カンマ) で分割して配列に。
[2]:’,'(カンマ)を含まず’.'(ピリオド)を含んでいる場合、’.'(ピリオド) で分割して配列に。
[3]:それ以外は、文字列を分割せずに配列の唯一の要素としてセット。

となります。

また、チェック時には大文字小文字の区別はされません。