- 更新日: 2016年2月23日
- PHP & CakePHP
CakePHPでログイン後に元のページにリダイレクトさせる
CakePHP 3 開発で、フレンドリーフォワーディング機能を実装しました。ユーザーがログインした後、ログインの直前に閲覧していた元のページにリダイレクトさせる機能です。ログイン直前のページの URL をセッションに保存しておき、ログイン後にそのURLにリダイレクトさせます。
— 環境 —
PHP 5.5.19
CakePHP 3.1.1
Auth.redirect というキー名のセッションを設定する
ちょっと解読に苦労したのですけど、公式ドキュメントや CakePHP ソースコードを読んだところ、’Auth.redirect’ というキーのセッションの値(URL/パス)が存在していた場合、AuthComponent::redirectUrl() がその URL/パス(’Auth.redirect’ というキー名のセッションの値)をリダイレクト先として返すことが分かりました。
Auth.redirect については、次の公式ドキュメントページにほんのちょっとだけ書いてあります。
Authentication – CakePHP Cookbook 3.x documentation
あとは、CakePHP 本体のソースコードを軽く読んで理解した。以下あたり。
vendor/cakephp/src/Controller/Component/AuthComponent.php
vendor/cakephp/src/Auth/Storage/***.php
実装の方針は、Rails で同じようなことを実装した時と一緒の方針で、AppController でリダイレクト先をセッションに保存しておくようにします。
Rails の Devise でログイン後にログインする直前のページにリダイレクトさせる | EasyRamble
Rails + Devise 環境でのフレンドリーフォワーディング機能を修正 | EasyRamble
AppController に storeRedirectPath() を実装
まずは AppController で、リダイレクト先であるログイン直前のページ(現在のページ)をセッションに保存する、storeRedirectPath() メソッドを実装します。
src/Controller/AppController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php namespace App\Controller; use Cake\Controller\Controller; use Cake\Event\Event; use Cake\Routing\Router; class AppController extends Controller { public function beforeRender(Event $event) { $this->storeRedirectPath(); if (!array_key_exists('_serialize', $this->viewVars) && in_array($this->response->type(), ['application/json', 'application/xml']) ) { $this->set('_serialize', true); } } private function storeRedirectPath() { $current_path = Router::url(); if ( !in_array($current_path, [ '/users/add', // ユーザー登録ページ '/users/login' // ログインページ ]) ) { $this->request->session()->write('Auth.redirect', $current_path); } } } |
‘/users/add’(ユーザー登録ページ)、’/users/login’(ログインページ)では、Auth.redirect のセッションを設定しないように除外しています。これによって、/users/login に遷移する直前のページのパスが、Auth.redirect のセッションに保存されます。
そして、実装した storeRedirectPath() を beforeRender() で読み込むようにします。最初 beforeFilter(Event $event) で読み込むように書いていたのだけど、それだと動きませんでした。なので、beforeRender(Event $event) に書く必要があります。
CakePHP 3 で、現在のページのURLやパスを取得する方法は以下参考。
CakePHP3で現在ページのURL・パスを取得する | EasyRamble
Users#login() でログイン後のリダイレクトを実装
実際のリダイレクトは、Cake\Controller\Controller::redirect() と AuthComponent::redirectUrl() を組み合わせて使う。
src/Controller/UsersController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php namespace App\Controller; use App\Controller\AppController; class UsersController extends AppController { // ... public function login() { if ($this->request->is('post')) { $user = $this->Auth->identify(); if ($user) { $this->Auth->setUser($user); $this->Flash->success('You are now logged in.'); return $this->redirect($this->Auth->redirectUrl()); } $this->Flash->error('Your username or password is incorrect.'); } } } |
Users#login() メソッドで、$this->Auth->redirectUrl() で取得できる Auth.redirect のセッションに保存された直前ページのパスにリダイレクトさせるようにしました。
CakePHP 3 での Auth コンポーネントによる、認証・認可機能の実装については以下を参照。
CakePHP3入門・開発チュートリアル | EasyRamble
以上で、ユーザーがログインした後に、ログインする直前にいた元のページにリダイレクトされるようになって便利です。
- PHP & CakePHP の関連記事
- PHP+MySQLでNo such file or directoryエラー
- bin/cakeコマンドでintlエラーが出る場合の対処(CakePHP)
- CakePHPアプリケーションをCapistranoでデプロイ
- Integrity constraint violation:Column ‘created’ in order clause is ambiguousエラー/CakePHP
- CakePHPでDB関連テーブルのレコード・データを取得
- CakePHPでカラム属性に別名/エイリアスを付ける仮想フィールド
- CakePHPで日付選択フォームのカスタマイズ
- CakePHP3で現在のコントローラー名・アクション名を取得
- PHPインストールでconfigure: error: freetype.h not foundエラー
- CakePHPで全てのモデル/テーブル名一覧を取得
Leave Your Message!