Transitionコンポーネント - checkData() について

Transition#checkData は複数入力画面の1画面目で使用することになるメソッドです。

CakePHPでは以下のようなパターンのコードをよく書くと思う。同一アクションでGET/POSTで処理をわけて、POSTできたときは保存してリダイレクトみたいな感じ。

class FooController extends AppController {
  public $uses = 'Foo';
  public function add() {
    if (!empty($this->data)) {
      (POSTデータがきたときの処理)
    }
    (GETでデータがきた場合でも実行する処理)
  }
}

Transition#checkDataはおおざっぱにいって以下のように書いたのと同じような動きをしてくれる。

class FooController extends AppController {
  public $uses = 'Foo';
         :
  public function step1() {
    // $this->Transition->checkData('step2') のおおざっぱな展開コード
    if (!empty($this->data)) {
      $this->Foo->set($this->data);
      if ($this->Foo->validates()) {
        $this->Session->write('session_key', $this->data);
        $this->redirect('step2');
      }
    } 
  }
}

POSTでデータを受け取ったら Foo モデルでバリデーションを行って、問題がなければ次のアクションへリダイレクトするという流れです。なぜ Foo モデルが使われるかというと checkData メソッドの第2引数を省略するとそのコントローラのデフォルトのモデルが使用されるからです。それがいやな場合は以下のようにバリデーションで使用したいモデルを指定することになります。

  $this->Transition->checkData('step2', 'Bar');
  // 複数のモデルでチェックしたい場合は配列でも指定できます。
  // $this->Transition->checkData('step2', array('Foo', 'Bar'));

今まで何度も何度も同じようなコードを書いてきたと思うがそれがすっきり1行になるってのはほんとすばらしいと思う。