CakePHPではまったこと 5(ログイン処理・レイアウト)

メタルギアソリッドが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()に入って欲しくないコントローラだけはじけます。
(あとで見たら相当おろかなことをやっていそうな。。)

追記:今はこんな感じ ログイン処理

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: PHP, フレームワーク パーマリンク

CakePHPではまったこと 5(ログイン処理・レイアウト) への1件のフィードバック

  1. PKBSFVCIBJNIMIC のコメント:

    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!

コメントを残す

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