Transitionコンポーネント - 要望など

ここにも書きつつGithubの方にもpull requestをしてみようかと思ってるんですが、現状のTransitionコンポーネントで以下の点がちょっと困ったので手を入れました。

- 遷移元のアクションの指定がアクション名でしか行えない
どういうことかというと、次の画面のアクションは Controller#redirect が受け付ける形式なら問題なく動作します。それはコードが以下のようになっているからです。(コードの一部を抜粋)

    if ($nextStep !== null && $this->autoRedirect) {
      $nextStep = !is_array($nextStep) ? array('action' => $nextStep) : $nextStep;
      $c->redirect($nextStep);
    }

しかし、遷移元のアクションの指定は実はアクション名でないと受け付けられません。それは以下のようなコードになっているからです。(関係するところだけコードを抜粋)

  if (is_array($prev)) {
    foreach ($prev as $p) {
      if (!$this->checkPrev($p, $message, $prevAction)) {
        return false;
      }
    }
    return true;
  }
  if ($prevAction === null) {
    $prevAction = $prev;
  }
  if (!$this->Session->check($this->sessionKey($prev))) {
    if ($this->autoRedirect) {
      $this->_controller->redirect($prevAction);
    }
    return false;
  }

最初のif文の処理で配列だった遷移元の指定は単体の文字列になるまで再帰処理されてしまいます。これを以下のようにすると次のアクションと同じように処理できるので変更して使ってます。

  if (is_array($prev) && !isset($prev['action']) {
    foreach ($prev as $p) {
      if (!$this->checkPrev($p, $message, $prevAction)) {
        return false;
      }
    }
    return true;
  }
  if ($prevAction === null) {
    $prevAction = $prev;
  }
  if (is_array($prev)) {
    $checkAction = $prev['action'];
  } else {
    $checkAction = $prev;
  }
  if (!$this->Session->check($this->sessionKey($checkAction))) {
    if ($this->autoRedirect) {
      $this->_controller->redirect($prevAction);
    }
    return false;
  }

これで action とキーに持つような配列は再帰処理されなくなるのでひとまず大丈夫になります。

基本的に引き継ぎたいデータは全部セッションにあるんだからリダイレクト先はアクション名だけでいいんじゃね?ということだったのかもしれないんですが、そうはいかない場合があるんですよね。特に携帯とか、携帯とか、携帯とか・・・

というわけで、予想通り超大作になったTransitionコンポーネントの説明はここまで。id:hiromi2424 さん本当に便利なコンポーネントを作っていただいてありがとうございました!