CakePHPのシェルでレベルに応じたコンソール出力を行う方法

CakePHPでシェルを使う際、コンソール出力をするにはプログラム中に$this->out($msg)を記述する。仕様は以下。

変数名 タイプ 説明 デフォルト
$message string|array 出力したい内容 null
$newlines int 出力後の改行数 1
$level int 出力レベル Shell::NORMAL

出力レベルとして指定できる値は、下記の3レベル。

フラグ 出力条件
Shell::QUIET 0 常に出力
Shell::NORMAL 1 未指定、quiet時に出力
Shell::VERBOSE 2 verbose指定時のみ出力

シェルの実行方法は次の通り。
cake shell_name [args]

オプション[args]に、出力レベルを指定することが可能。
指定しないとnormal(quietとverboseの間)になる。

cake shell_name --quiet             # quiet
cake shell_name                     # normal
cake shell_name --verbose           # verbose

シェル起動時に指定した[args]と、out()で指定した出力レベルにおける出力、非出力(×)を表にすると次の通り。

args Shell::QUIET Shell::NORMAL Shell::VERBOSE
–quiet 出力 × ×
(指定なし) 出力 出力 ×
–verbose 出力 出力 出力

結果はこんな感じに。

$this->out('Quiet message', 1, Shell::QUIET);
$this->out('Normal message', 1, Shell::NORMAL);
$this->out('Loud message', 1, Shell::VERBOSE);

cake shell_name --quiet
Quiet message

cake shell_name          
Quiet message
Normal message

cake shell_name --verbose
Quiet message
Normal message
Loud message

3レベルの使い分け方が自分にはいまいち分からないので、デバッグ時のみ確認したい値だけShell::VERBOSEを指定して、それ以外は未指定(Shell::NORMAL)でいいんじゃないかと思ってみたり。

CakePHP 2.xでLayoutとViewを書かずにJsonでAjax

前置き

CakePHPでAjaxをしたかった。ついカッとなってやった。

参考にしたページ

公式ドキュメントどすなぁ
JSONとXMLビュー — CakePHP Cookbook 2.x ドキュメント

手順

  1. routes.phpにRouter::parseExtensions('json');を記述
    • 既に書いてある場合は、引数を('xml', 'json')みたいな感じに追記すればオッケー
  2. Controllerにpublic $components = array('RequestHandler');を追記
    • 使用するコントローラーに書けばいいけど、全体に適用するならAppControllerでもいいね
    • posts/index.json のように.jsonでリクエストを受けた時にJsonViewクラスを適用してくれる
    • application/json でリクエストを受けた時も同様にJsonViewを適用してくれる(らしい)
  3. Actionに書くことは2つ
    • $this->set(compact('posts')); または $this->set('posts', $posts); で変数を渡す
    • $this->set('_serialize', array('posts')); で指定した変数をjson_encodeして出力
    • 2つめの_serializeを書かないと、普通にactionname.ctpのビューファイルを読みにいくので注意

感想

うーん、なんと簡単。ドキュメントにも書いてある通り複雑なことも出来るけど、これだけの記述でさっくり書けるのは魅力的。Ajax Lifeが捗りますな…