CakePHPでログイン後に元のページにリダイレクトさせる

スポンサーリンク
【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました

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

‘/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

Users#login() メソッドで、$this->Auth->redirectUrl() で取得できる Auth.redirect のセッションに保存された直前ページのパスにリダイレクトさせるようにしました。

CakePHP 3 での Auth コンポーネントによる、認証・認可機能の実装については以下を参照。

CakePHP3入門・開発チュートリアル | EasyRamble

以上で、ユーザーがログインした後に、ログインする直前にいた元のページにリダイレクトされるようになって便利です。

スポンサーリンク
私は Ruby on Rails の前は、PHP & CakePHP を使っていました(今も使いますけど)。PHP についてはオライリーの本を中心に軽く10冊以上は読み込みました。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!