メタルギアソリッドがXBOXに行っちゃったりするんでしょうか。
がんばれPS3!持ってないけど!
CakePHPでのログイン処理って、みんなapp_controller.phpのbeforeFilterでやろうとしてはまってるらしいです。
実は私もです。私の場合、なにが問題だったかというと、ログインしないとサインアップできないという・・・ね?
function beforeFilter()
{
if($this->LogIn->isLoggedIn() == FALSE){
$this->layout = "login"; // ログイン画面表示用のテンプレート(login.thtml)
} else {
$this->layout = "default"; // デフォルトのテンプレート(default.thtml)
}
}
まあ、app_controller.phpで上のようにしていたわけです。ここでは「LogIn」っていうログイン処理をするコンポーネントを使っているとします。
何が問題かっていうと、例えばサインアップするためのメソッド「signup()」を「users_controller」が持っているとすると、サインアップするときは「/users/signup/」にアクセスすることになると思います。そうすると、まずapp_controllerのbeforeFilter()に入ってきて、当然まだログインしてないわけですから、「login.thtml」に飛ばされることになります。で、永遠にログイン画面を彷徨えます。
ログインしていれば、beforeFilter()を通り抜けて「default.thtml」に飛ばされるので、OKなわけです。変なことになってます。
(そもそも上のはレイアウトを変更しているだけなので、ログインしていなくてもコントローラの処理は走ります。まあ、かなりの大問題ですが、それはここでは置いといて。それに関しては後日考えます。たぶん。)
そういうわけで、以下のようにして無理やり切り抜けました。おそらくこんなことはしないほうがいい。
function beforeFilter()
{
if ($this->name == "Users" || $this->name == "app") return;
if($this->LogIn->isLoggedIn() == FALSE){
$this->layout = "login"; // ログイン画面表示用のテンプレート(login.thtml)
} else {
$this->layout = "default"; // デフォルトのテンプレート(default.thtml)
}
}
ちゃんと$this->nameにコントローラの名前が入ってきます。app_controllerの場合は「app」のようです。
これで、app_controllerのbeforeFilter()に入って欲しくないコントローラだけはじけます。
(あとで見たら相当おろかなことをやっていそうな。。)
追記:今はこんな感じ ログイン処理
以上
wonderful post, very informative. I wonder why the other specialists of this sector do not notice this. You should continue your writing. I am sure, you have a huge readers’ base already!