before()メソッド内での,Response::redirect を使用すると「このページは表示できません」となります。

967 views
Skip to first unread message

HofeHofe

unread,
Apr 8, 2014, 11:26:21 AM4/8/14
to fuelp...@googlegroups.com
こんばんは,毎度お騒がせ致していますが,またよろしくお願い致します。

次のように,before()メソッドを使ってログインチェックを行うという場面です。

 public function before()
 {
   parent::before();
   
   if (!Auth::check())
   {
            Response::redirect('hofe/login');
   }
  }

このようなコードを,ログインしていない状態で実行すると,青い大きな字で「このページは
表示できません」となります。ログインした状態では,問題なく表示されるので,おかしいと思い,

 public function before()
 {
   parent::before();
   
//   if (!Auth::check())
//   {
            Response::redirect('hofe/login');
//   }
  }


として,強制的に, Response::redirect('hofe/login'); を実行してみたところ,やはり,同様に,
「このページは表示できません」となりました。 Response::redirect('hofe/login');のところで,問
題が起こっているようです。
どのような,理由でこのようなことが起こるのでしょうか。
logも出ませんので,見当がつかなくて困っています。
多分,これまでの学習の中で,何か設定をいじったりしていて,うまくページ遷移が出来なくなっ
ているものと思われます。お心当たりのおありの方がいらっしゃいましたら,よろしくお願い致し
ます。

Kenji Suzuki

unread,
Apr 8, 2014, 6:28:57 PM4/8/14
to fuelp...@googlegroups.com
Kenji です。


これだけだとよくわかりませんが、リダイレクトが無限ループしているとか
でしょうか?

あと、違うブラウザでもアクセスしてみると何かわかるかも知れません。

また、ログが出ないということですが、

* FuelPHP のログ
* Web サーバのログ

いずれも何も出ないでしょうか?


// Kenji
> --
> このメールは Google グループのグループ「fuelphp.jp」の登録者に送られています。
> このグループから退会し、グループからのメールの配信を停止するには fuelphp_jp+...@googlegroups.com にメールを送信してください。
> その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。

Omega

unread,
Apr 8, 2014, 10:19:11 PM4/8/14
to fuelp...@googlegroups.com
Omegaです

Kenji様も仰っていますが、恐らくリダイレクトの無限ループかと思われます
リダイレクトしているhofe/loginの中でもbeforeメソッドが呼ばれているのではないでしょうか?

ログ出力についてですが、beforeの中で
$request = $this->request;
Log::error('controller='.$request->controller.' action='.$request->action);
でコントローラーとアクション名を出してみては如何でしょうか?
(ログ出力先はapp\config\config.phpにあるlog_pathを参照してください)

2014年4月9日水曜日 0時26分21秒 UTC+9 HofeHofe:

HofeHofe

unread,
Apr 10, 2014, 4:54:05 PM4/10/14
to fuelp...@googlegroups.com
Kenji様 ,Omega様 ありがとうございます。

まさに,その通りです。確かにController_Hofeクラスのindexアクションを呼び出そうというときに,
before()の中でログインチェックをして,’Hofe/login’を呼び出しているのでした。ですから,このとき,
再び,before()を通ることになります。これで,「無限ループ」に入ることになるのでしょうね。
たぶん,きっと・・・。

ということは,before()でリダイレクトするloginアクションは,このbefore()があるクラス以外のクラス
になければならないということなのでしょうか?

Logについて,勉強不足ですみません。使い方がいまいち分かりません。APPPATH/logsに日付ごとに
ファイルが出来ていることを初めて知りました。Omega様がおっしゃっている$requestプロパティの
使い方について,下記のコードの記述位置など,今少し教えていただけませんでしょうか。よろしく
お願い致します。

Kenji Suzuki

unread,
Apr 10, 2014, 5:29:39 PM4/10/14
to fuelp...@googlegroups.com
Kenji です。


On Thu, 10 Apr 2014 13:54:05 -0700 (PDT)
HofeHofe <emik...@cocoa.ocn.ne.jp> wrote:

> Kenji様 ,Omega様 ありがとうございます。
>
> まさに,その通りです。確かにController_Hofeクラスのindexアクションを呼び出そうというときに,
> before()の中でログインチェックをして,’Hofe/login’を呼び出しているのでした。ですから,このとき,
> 再び,before()を通ることになります。これで,「無限ループ」に入ることになるのでしょうね。
> たぶん,きっと・・・。

そうですね。


> ということは,before()でリダイレクトするloginアクションは,このbefore()があるクラス以外のクラス
> になければならないということなのでしょうか?

Hofe/login の場合だけリダイレクトしないように除外すればいいです。

以下は oil g admin で生成するコードのテンプレートですが、参考になると思います。

https://github.com/fuel/oil/blob/1.8/develop/views/admin/crud/controllers/admin.php#L11


> Logについて,勉強不足ですみません。使い方がいまいち分かりません。APPPATH/logsに日付ごとに
> ファイルが出来ていることを初めて知りました。Omega様がおっしゃっている$requestプロパティの
> 使い方について,下記のコードの記述位置など,今少し教えていただけませんでしょうか。よろしく
> お願い致します。
> $request = $this->request;
> Log::error('controller='.$request->controller.' action='.$request->action);

before() の中でということでしたね。実行される場所ならどこでもいいですが、
例えば、before() の最初に記述すれば、そこで Log::error() が実行されログが記録されます。


// Kenji

HofeHofe

unread,
Apr 12, 2014, 7:55:01 AM4/12/14
to fuelp...@googlegroups.com
kenjiさんありがとうございました。

無事,思うとおりの挙動が出来ました。
なるほど,納得です。
Logも,初めて使うことが出来ました。

いつも,ありがとうございます。これからも,よろしくお願い致します。

HofeHofe
Reply all
Reply to author
Forward
0 new messages