ユーザログイン周りの実装

ログイン状況によって、ログインボタンやらログオフボタンを配置する。そんなことをしていると、ログイン後に遷移前の画面に戻りたくなってきました。そこらへんの情報がここに。先人の活躍に感謝しながら舗装された道を突進中です。

方法2を使おうとapp_controllerに現在のuriをwriteするようにしたんだけどどうもうまく動かない・・・あれこれ調べた結果、ドキュメントにこんな記述を発見。

また子コントローラのコールバックを使う場合、期待した動作をさせるためには、その中で AppController のコールバックを呼び出す必要があることに留意してください。
function beforeFilter(){
parent::beforeFilter();
}

子でbeforeFilterをオーバーライドしちゃってた。なるほど!これで動くようになりました。次に悩んだのは、Usersコントローラのloginメソッドにリダイレクトの記載をすると、ログイン画面が出る前にリダイレクトされちゃう件。ログオフできてもその後にログインできない!アイヤー!と思いながら調べていると、ビューのlogin.ctpを呼ぶ前にコントローラを通るので、

if (!empty($this->data)) {
/*ここにリダイレクト処理を書く*/
}

てやらないとログイン画面を出す前に無条件にリダイレクトしてしまうんだな。なるほど。これも無事解決。今日はなんだかすごいスピードで仕事がはかどりつつある感じです。晩御飯にガッツリとトンコツラーメン食ってきたからかな。調子イイ!・・・と思ったらなんかまだ解決してないみたい。ログイン後ももう一度ログイン画面に戻ってきてしまう。ログオフ側はうまくいってるのになぁ。。。おかしい。

しばらくソースを眺めていて判明しました。変数のスコープの問題でしたorz

function login(){
if($this->Session->check('login_back_url')){
$login_back_url = $this->Session->read('login_back_url');
$this->Session->delete('login_back_url');
}else{
$login_back_url = '/';
}
$this->Session->setFlash('こっそりログインした’);
$this->redirect($login_back_url);
}

$login_back_urlはif文の中で定義されているので、ifブロックの外でredirectから呼んでもnull。だからもう一度ログイン画面に戻ってたわけね・・・納得。

function login(){
if (!empty($this->data)) {
//ログイン完了後に元いたところに戻る
$login_back_url = ife($this->Session->check('login_back_url'),$this->Session->read('login_back_url'),'/');
$this->Session->delete('login_back_url');
$this->Session->setFlash('こっそりログインした');
$this->redirect($login_back_url);
}
}

こんな感じで書き換えてバグ解消。ふぅ。しかし、ログオフ処理は前のでうまくいってるので、スコープの問題でもないのかな。まぁ動くようになったからいいや。