質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

Q&A

解決済

2回答

1030閲覧

CAKEPHP3:ログイン画面へのリダイレクト先について

ranchu

総合スコア51

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Authentication

Authentication(認証)は正当性を認証する為の工程です。ログイン処理等で使われます。

0グッド

0クリップ

投稿2017/07/20 08:14

編集2017/07/20 08:50

###前提・実現したいこと
CAKEPHP3のAuthコンポーネントを利用して、ログイン認証をしたいと思っております。
ただし、多言語に対応させる必要があり、URLとしてはhttps://www.hoge.com/jp/users/login
のようになることを想定しています。(「jp」部分にはその他「en」などの言語設定を表す文字列が入ります)

###発生している問題・エラーメッセージ
AuthコンポーネントのloginActionの設定でcontrollerとactionの指定をすることで
https://www.hoge.com/users/loginにリダイレクトはできるのですが、
https://www.hoge.com/jp/から認証の必要なページにアクセスしても
https://www.hoge.com/users/loginにリダイレクトされてしまい、
言語設定を表す「jp」が失われてしまいます。

これを言語設定つきのhttps://www.hoge.com/jp/users/login
へリダイレクトさせるためにはどのようにすればよいでしょうか?
よろしくお願いいたします。

###ルーティング設定
routes.phpは以下のように(全てではありませんが)記載しています。

$routes->connect('/:language/:controller/:action/*', ['controller' => null, 'action' => null], ['language' => 'jp']); $routes->connect('/:language/:controller/*', ['controller' => null, 'action' => 'index'], ['language' => 'jp']); $routes->connect('/:language/:controller/:action/*', ['controller' => null, 'action' => null], ['language' => 'en']); $routes->connect('/:language/:controller/*', ['controller' => null, 'action' => 'index'], ['language' => 'en']); $routes->connect('/:language/:controller/:action/*', ['controller' => null, 'action' => null], ['language' => 'ja_JP']); $routes->connect('/:language/:controller/*', ['controller' => null, 'action' => 'index'], ['language' => 'ja_JP']); $routes->connect('/:language/:controller/:action/*', ['controller' => null, 'action' => null], ['language' => 'en_US']); $routes->connect('/:language/:controller/*', ['controller' => null, 'action' => 'index'], ['language' => 'en_US']);

日本語ページへは/jpまたは/ja_JPでアクセスする想定です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popobot

2017/07/20 08:22

なんらかのプラグインかprefixルーティングを使っているのでしょうか?
guest

回答2

0

自己解決

icchii様

ご回答ありがとうございました。
ご教示いただいたようにpersistの指定を行ってみたのですが、
https://www.hoge.com/users/loginへリダイレクトされてしまう
現象は変わらなかったのですが、Authコンポーネントの読み込みで

'loginAction' => [ 'controller' => 'Users', 'action' => 'login', 'language' => $language ],

としてその前に$languageに言語設定パラメータを格納しておくことで、
https://www.hoge.com/jpにアクセスした際にはログイン画面を
https://www.hoge.com/jp/users/loginとしてリダイレクトできるようになりました。

これがベストな方法では恐らくないかと思いますがひとまず目的の動作はできたので
自己解決としてクローズさせていただきます。

投稿2017/07/21 04:12

編集2017/07/21 04:13
ranchu

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

popobot

2017/07/21 06:41

なるほど、'language'も設定しちゃえばよかったんですね すみません... 後langじゃなくてlanguageだったので、'persist' => ['language']と指定しなければだめだったかもです(すでにやってみていたらスルーしてください)
ranchu

2017/07/21 07:27

補足ありがとうございます。 'persist' => ['language']も試してはいましたが結果は同様でした。
popobot

2017/07/21 08:18

ご連絡ありがとうございます。そうなんですね...コード上はそれっぽい処理がありましたが、何か足りないのかもしれません。なお、もう少し調べたところRouter::addUrlFilter()を使う方法もありそうだったので、自分の回答に追記しておきました。時間があったら試して見てください ※全url指定で'language'を指定すれば今のやり方でもうまくは行きそうですけどね
guest

0

試してはいませんが、connect()の第3引数に'persist' => ['lang']を指定すればうまくいくかもしれません。CakePHP3のマニュアルにはありませんが、2系のマニュアルには説明が書いてありました。

persist はURLを新規に生成したときに、どのルーティングパラメーターが 自動的にインクルードされるのかを定義するために使われます。 URLで再定義することで一定のパラメーターをオーバーライドしたり、 false に設定することで除去できます。たとえば、 'persist' => array('lang') のように。

その他の参考

  • 同じような質問がStackoverFlowにありましたので参考にしてください。
  • また、そのような対応ができそうなプラグインcakephp-i18nもありました。

追記 persistオプションがうまく動かないみたいなので、もう少し調べたら、Router::addUrlFilter()方法があるみたいなので載せておきます。(実際には試していません)

php

1Router::addUrlFilter(function ($params, $request) { 2 if ($request->param('language')) { 3 $params['language'] = $request->param('language'); 4 } 5 return $params; 6}); 7

参考

投稿2017/07/20 21:08

編集2017/07/21 08:16
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ranchu

2017/07/21 08:44

追記ありがとうございます。 Router::addUrlFilter()を使ってみたところ、ログインURLに直接アクセスした場合 (https://www.hoge.com/jp/users/login) には言語設定のついたログインページへアクセスできたのですが、 未ログイン状態で認証の必要なページへアクセスしログインページへリダイレクトされた場合 (https://www.hoge.com/jpへアクセスしてログインページへリダイレクト) には言語設定が外れてしまいました。 Router::addUrlFilter()を使わないときはログインURLに直接アクセスした場合でも https://www.hoge.com/users/loginにリダイレクトされてしまっていたので、 もし自分のやり方で何か問題が出た場合にはご教示いただいた方法の利用も検討したいと思います。 (未ログイン時の自動リダイレクトを止めたりできればこれでもいけそうですし)
popobot

2017/07/21 09:16 編集

検証ありがとうございます。うーん、不思議ですね... 手元の環境で動作確認してみたら、ちゃんと/jp/users/loginにリダイレクトできました。CakePHPのバージョンは3.4.10で検証しました。 Router::addUrlFilter()もpersistもどちらも動きました。 少し気になったのはroutes.phpの$routes->connect('/:language', []);の設定が質問に記載されていないけどどうなっているのかなぁぐらいで後は特別何も設定はいらなそうでした。 ※自分は興味本位でやっているので、お忙しいと思いますので、別に返信不要ですよ^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問