【CakePHP2】思いがけない場所でコントローラーの関数が動作してないかチェック

気づくことの発端

$this->Session->write(‘data’, $data)で変数を入れたはずなのに、
再び$data=$this->Session->read(‘data’)で読み込もうとすると何故かセッションデータが消えたり、書き換わってたりしてしまう。
セッションが全部消えたわけでも無いのに何でなのかとどっぷりハマって調べてみると、ある可能性に行き着いた。

それは…
1回のページのアクセスでコントローラーの関数(メソッド)が複数回実行されたり意図してない場所でも実行されている可能性である。
なんとも厄介な…と思って試しに

$this->log('Access To Article/add', 'debug');

を気になる場所に埋め込んでみる。

【例】
fooController.php

//...
 function bar(){
  $this->layout="type_a";
  //...
 $this->log('Access To foo/bar', 'debug');
  $data=$this->Bar->find(...);
  $this->Session->Write($data);
}

hogeController.php

//…
function huga(){
  $this->layout="type_a";
  //...
 $this->log('Access To hoge/huga', 'debug');
  $this->Session->delete($data);
}

と入れて対象の/foo/var/のURLを叩いて
/app/tmp/logs/debug.log
を見ると、

…
2014-xx-yy 11:22:33 Debug: Access To foo/bar
2014-xx-yy 11:22:33 Debug: Access To foo/bar
2014-xx-yy 11:22:33 Debug: Access To hoge/huga

という具合に1回のアクセスでfoo/barメソッドが2回ずつ実行されてたり挙句の果てにはhoge/fugaメソッドまで何で実行されてるんだ?なんてゆかいな事態になってましたorz。
ここでhoge/fugaメソッドを勝手に実行されてたらせっかくセッションに入れたデータが…\(^o^)/

【解決法】
もうこれ以上悪夢を話すのは嫌なので早速解決法に移ろうと思いますw
問題はビューにあるのではないかと試しにビューを全部コメントアウトすると直りました。
そこでビューのどこが問題なのか探すべく、2分探索法のノリで
半分コメントアウト→直ったらコメントアウトを半分に→直らなかったらコメントアウトしてなかった部分に着目して半分コメントアウト
を繰り返して原因を特定…

結果としては今回の場合はテンプレートのタグのurlの部分をサイトルートでなく相対パスで書いてたからのようでした。
今回勝手に呼び出されたメソッドは、アクセスしたページと同じテンプレートを利用していたという共通点があったのでもしかするとその範囲で勝手に実行されているのかもしれませんが、それにしても意図せず勝手に実行されてセッションが変わってしまってたとは‥困ったものです。

コメントを残す

メールアドレスが公開されることはありません。