Laravelで検索機能実装時に「リダイレクトが繰り返し行われました。」と表示された件


検索機能作成時に「リダイレクトが繰り返し行われました。」とエラーが発生!

自分なりに調べてみましたが、核心を得た答えに辿り着くことができず、なかなかに苦労したので備忘録として残します。

まずは検索フォームのコードです。

Formファサードを利用しているので以下のコードになります。

index.blade.php
{!! Form::open(['route' => 'report.index', 'method' => 'GET']) !!}
  {!! Form::text('search', '', ['class' => 'form-control', 'type' => 'search', 'placeholder' => '----年--月']) !!}
  {!! Form::button('<i class="fa fa-search"></i>', ['class' => 'btn btn-icon', 'type' => 'submit']) !!}
{!! Form::close() !!}

検索フォームに入力された値をindexアクションへGET送信します。
送信された値はRequest $requestで受け取ります。

続いてはコントローラー内のindexアクションの記述になります。

DailyReportController.php
public function index(DailyReportRequest $request)
{
    $search = $request->input('search');
    dd($search)
    return view('user.daily_report.index', compact('dailyReports'));
}

formから送信された値を$requestで受け取ります。

ここではLaravelに既存で搭載されているサービスプロバイダという機能を使って、自動でRequestクラスから$requestインスタンスを作成してくれています。

詳しくは以下の記事を参考にしてください。
hoge(Request $request)ってなんだ??👶

$requestに送信された値をinputメソッドで受け取り、変数$searchへ代入。
dd($search)で送信された値を確認しようとしました。

しかし...ここでエラーが発生!!

リダイレクトが繰り返し行われているとな、、、?

念のためデベロッパーツールのNetworkでも確認してみます。

やはりリダイレクトが起きている様子...!

ちなみに「status」の「302」はHTTPステータスコード「302リダイレクト」というものでその名の通りリダイレクト発生を示しています。

今回のケースではコントローラー内のindexアクションのdd($search)$searchの中身が表示され、処理が止まるはずなのですが、先ほどのエラー画面が表示されています。
このことからdd($search)まで処理が来ておらず、DailyReportRequest$requestの箇所に原因があることがわかります。

ここまでは特定できた、、、、、
だが、今回のエラーを自分なりに調べてみたが、解決策を見つけることができず、、、、

自分の調べ方が悪いのかと、色々考えを巡らせましたが、どうにもこうにもいかない、、、
最終的に先輩社員に質問し、原因が特定でき、解決することができました。

結論としては、Validationが掛かっていたためのリダイレクトでした!

どういうことかというと、、、

コントローラーのstoreupdateアクションで設定していたDailyReportRequestindexアクションの引数に渡していたことで、storeupdateアクションのvalidationが掛かってしまっていました。

DailyReportRequest.php
~省略~
    public function rules()
    {
        return [
            'reporting_time' => 'required|before_or_equal:today',
            'title' => 'required|max:255',
            'contents' => 'required|max:1000',
        ];
    }

    public function messages()
    {
        return [
            'required' => '入力必須の項目です。',
            'reporting_time.before_or_equal' => '今日以前の日付を入力してください。',
            'max' => ':max 文字以内で入力してください。',
        ];
    }

このvalidationが掛かっていると、検索フォームから送信した値にもvalidationチェックを行ってしまいます。
当然、送信された値には上記のアクションでvalidationが失敗する値が送信されてきます。

validationは入力値が設定した条件を満たしていない場合、入力画面にリダイレクトします。

そのため、入力フォームから値を送信した際に、無限リダイレクトが発生し、「リダイレクトが繰り返し行われました。」のようなエラーが発生していました。

というわけでindexアクションを修正します。

DailyReportController.php

public function index(Request $request)
{
    $search = $request->input('search');
    dd($search)
    return view('user.daily_report.index', compact('dailyReports'));
}

Request, $requestでよかったんだ、、、、

しっかりuse宣言で利用するRequestクラスの記述を忘れずに、、、

use Illuminate\Http\Request;

こちらで無事に$searchで送信された値の受け取りに成功!

こうしたエラーは調べてもなかなかお目当てのものに辿り着かないため、しっかりとロジックを理解して解決を目指すことが重要だそうです。

いい勉強になりました、、、、

また、エラーを調べる時も、予め自己解決を目指す時間を設定し、それを超えてしまったら直ぐに質問するのが良いですね。
素直に現在の自分の実力と向き合うのが大切だと学びました。