しょぼしょぼプログラマ雑記

自分のための備忘録。 開発記録など掲載してます。 質問・ご意見・ご感想等はTwitter ( https://twitter.com/yun_hokuto ) までお気軽にどうぞ。

CakePHP3でログイン後のリダイレクトページを変更する(2015/06/23 追記)

CakePHP3の公式ドキュメントにあるチュートリアルでは、ログイン処理を下記のように記載しています

<?php
// In src/Controller/UsersController.php

public function login()
{
    if ($this->request->is('post')) {
        $user = $this->Auth->identify();
        if ($user) {
            $this->Auth->setUser($user);
            return $this->redirect($this->Auth->redirectUrl());
        }
        $this->Flash->error('Your username or password is incorrect.');
    }
}

ここでリダイレクト処理をしているのは下記の部分です

return $this->redirect($this->Auth->redirectUrl());

これは分かりやすいですが、問題は「$this->Auth->redirectUrl()」の部分です

これは状況に応じてリダイレクト先が変わります

詳細は下記公式ドキュメント参照

Authentication — CakePHP Cookbook 3.x documentation

ただ、ログインリンクは基本どこからでもアクセスさせるように表示させているものがほとんどではないでしょうか?

そのアクセス元のページが「ログイン後にアクセスされると困るページ」だった場合、トップへ飛ばしてあげたりしたいという

要望があり、今回の記事になっています

ただ、その前に「ログイン後の基本的なリダイレクト先」を設定する方法を記載します

AppController.php
<?php
public function initialize()
{
    $this->loadComponent('Auth', [
        'loginRedirect' => [
            'controller' => 'Books',
            'action' => 'index',
        ]
    ]);
}

この内容で「$this->Auth->redirectUrl()」が返す基本的なURLが指定できます

そして、本題の「ログイン後のリダイレクトページを変更する」です

BooksController
<?php
public function complete()
{
    $this->Auth->loginRedirect = [];
} 

これだけです

これで、リダイレクト先がサイトトップになります

ご覧のとおり、「ログイン後にアクセスされると困るページ」の処理内で「loginRedirectを空っぽにする」だけです

公式にはほとんど記載がありませんので、参考にどうぞ


CakePHP version: 3.0.6 で作成しております


※2015/06/23 追記


記載した内容だけでは確実にログインページを変更できない現象が出ました。

下記のような記述方法でログイン後のページをControllserから変更できます

<?php
public function complete()
{
    $this->Auth->loginRedirect = [];
    $session = $this->request->session();
    $session->write('Auth.redirect', ['controller'=>'Books', 'action' => 'index']);
}

Session内にある「Auth.redirect」が設定されている場合は、loginRedirectより優先されます。

詳しい内容は下記の公式ページに記載してありました

Authentication — CakePHP Cookbook 3.x documentation