読者です 読者をやめる 読者になる 読者になる

ゾンビ映画で主人公がTシャツ着てるのが納得いかない

だって噛まれたらゾンビになるんですよ。プロテクトしろよやる気あんのか

cakePHPでリダイレクトが効かなくなったらcomponentのせいかも

cakeでハマったのでメモ。

 

cakePHP1.3で構築してあるモジュールで、

突然入力フォームが動かなくなったと他プロジェクトの人から相談を受けた。

 

「フォームが動かない」っていうのは何かっていうと、つまりは

入力フォーム(/form/index)で必要な情報を入力した後に

「確認画面へすすむ」ボタンをクリックしても、

本来表示されるはずの確認画面(/form/confirm)が表示されずにまた入力フォームが表示されてしまう、という事だった。

要するにループしちゃうと。 

 

controllerのindexアクションを見てみると、

if( $this->FormData->validates() )
{
      $this->redirect(array('action' => 'confirm'));
}

大体こんな感じになっている。

 

で、処理は$this->redirect(array('action' => 'confirm'));に入っているんだけど、

confirmアクションにリダイレクトされずにindexアクションが呼び出されているらしい。

 

・・・・?

redirectになんかおかしな部分ある?って思ってみたけど、何にもわからない。

他と違うようには見えないけど?

 

 

 

仕方ないので、app_controller.phpのredirectの処理まで追ってみた。

やっぱりわからない。

 

うーん・・・・

とりあえず、AppControllerの親のControllerまで追ってみた。

 

$response = $this->Component->beforeRedirect($this, $url, $status, $exit);

 

if ($response === false) {

    return;

}

if (is_array($response)) {

    foreach ($response as $resp) {

        if (is_array($resp) && isset($resp['url'])) {

            extract($resp, EXTR_OVERWRITE);

        } elseif ($resp !== null) {

            $url = $resp;

        }

    }

}

 

「$response」の中を見てみたら「array(0) {} 」・・に・・なっとる?

 

 

nullでもないし、そりゃ元のページに戻るわな。

 

 

で、色々調べていったら、そもそものcontrollerで呼び出してるcomponentが

class FormComponent extends Component{

ってなっているのが原因だった。

 

class FormComponent extends Object{

が正解。

 

こりゃハマるわけだ・・

 

 

修正したら無事リダイレクトできました。