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

ほげほげ(仮)

仮死状態

CakePHPのAuth->redirectについて

PHP


最近はCakePHPばっかりいじってます。


Authコンポーネントでのredirectでハマってしまったのでメモしておきます。
ちなみにバージョンは1.3.6です。

<?php
public function beforeFilter() {
    $this->Auth->autoRedirect = false;
}
public function login() {
    if($this->Auth->redirect() == '/hoge') {
        $this->redirect('/hogehoge');
    } else {
        $this->redirect($this->Auth->redirect());
    }
}
?>

上のように$this->Auth->redirect() を2回呼びだしてしまうと1回目と2回目の値が変わってしまい、おかしなことになっちゃいます。


原因はcake/libs/controller/components/auth.phpのソースを見れば分かります。

<?php
function redirect($url = null) {
    if (!is_null($url)) {
        $redir = $url;
        $this->Session->write('Auth.redirect', $redir);
    } elseif ($this->Session->check('Auth.redirect')) {
        $redir = $this->Session->read('Auth.redirect');
        $this->Session->delete('Auth.redirect');

        if (Router::normalize($redir) == Router::normalize($this->loginAction)) {
            $redir = $this->loginRedirect;
        }
    } else {
        $redir = $this->loginRedirect;
    }
    return Router::normalize($redir);
}
?>

$this->Session->delete('Auth.redirect')で消されちゃってますね。


遷移元で分岐をする場合は変数などに一度格納してから判定、リダイレクトしたほうがいいですね。

<?php
public function login() {
    $url = $this->Auth->redirect();
    if($url == '/hoge') {
        $this->redirect('/hogehoge');
    } else {
        $this->redirect($url);
    }
}
?>