• 【質問】redir
    ect先のURIとルーティングで指定したURIについ...
  • LataLata 
    【質問】redirect先のURIとルーティングで指定したURIについて

    《関連部分》
    前レッスン(lesson11)動画:5:40~
    本レッスン(lesson12)動画:5:50~

    いつもお世話になっております。
    新規登録の処理を行った後のリダイレクト先と、
    ルーティングで指定したURIの相違についての質問です。


    ●前回の動画内では新規登録におけるルーティングを以下のように設定しておりました。
    [web.php]
    Route::post('/drills', 'DrillsController@create')->name('drills.create');

    ●また、同じく前回の動画で入力フォームには次のように設定しておりました。
    [new.blade.php]
    <form method="POST" action="{{ route('drills.create') }}">

    ○今回の動画ではリダイレクト先を以下のように設定しておりました。
    [DrillsController]
    return redirect('/drills/new')->with('flash_message',__('Registered'));


    すると、フォームのactionの指定先は'/drills'になっているのに対し、
    リダイレクト先は'/drills/new'となっています。

    Route::~~で指定するURIは本来、
    移動先のURIページに指定するという解釈していたのですが、
    今回のように移動先とリダイレクト先が異なることが起きたため、少々混乱してしまいました。

    この混乱をなくすため、補足にある方法を使い、
    return redirect()->route('drills.create')->with('flash_message', __('Registered.'));
    のように、実際にアクションを呼び出しているルーティングと同じURIを指定する事で、
    移動先を'drills'に一致させる方法が良いのではないかと考えました。

    今回の相違については、特に問題視する必要はないのでしょうか、
    また、他にURIに指定するものの基準があるのでしょうか。


    細かい部分についての質問で恐縮ですが、
    ルーティングのURIの指定先について理解を深めたく、質問させていただきました。
    ご教授いただければ幸いです。どうぞよろしくお願いいたします。
    回答 1

    ウェブカツコーチ 
    講師からの回答
    ・動画パターン:
    return redirect('/drills/new')->with('flash_message',__('Registered'));
    ・補足パターン:
    return redirect()->route('drills.new')->with('flash_message', __('Registered.'));


    上記のDrillsControllerのcreateアクション後のリダイレクトの行い方について、
    直にパスを書いて指定してリダイレクトを行っているか(動画内パターン)、routeメソッドを使って名前付きルートdrills.createのURIを指定してリダイレクを行っているか(補足パターン)の違いがあるだけです。
    特にどちらかが良くてどちらかが悪いということは無いので、ご自身がわかりやすい方を使って問題ありません。

    >フォームのactionの指定先は'/drills'になっているのに対し、リダイレクト先は'/drills/new'となっています

    この辺りは基礎的な部分なので、もし理解が浅いのであれば復習をしておきましょう。
    例えばウェブサービス部の内容を思い出してみてください。profEdit.php等、下記のようなコードが書かれたファイルが沢山あったはずです。

    1.hogehoge.phpファイル内のformで、action=""にして(そうするとactionの指定先は自ファイルになるのでしたね)POST送信を行う。
    2.hogehoge.php内で、if(!empty($_POST))でPOST送信が合ったことを確認し、以下の処理を実行する。
    3. 処理完了後header("fugafuga.php");で別ファイルfugafuga.phpを指定してリダイレクトを行う(fugafuga.phpにページ遷移する)

    リダイレクトとはあるページから別ページへの転送処理のことで、素のPHPではheader()で実行していたものです。そしてformタブ内のaction属性は、あくまでフォームデータの送信先URLを指定するためのものであり、リダイレクトとは全くの別物です。
    なので、フォームのaction属性とリダイレクト先を一致させる必要はありません。


    >Route::~~で指定するURIは本来、移動先のURIページに指定する

    ここは少しweb.phpのルーティング定義の解釈を誤っています。
    名前付きルートを指定したredirect()の際は、Route::~~の第1引数に指定されたURIを解決し、そこに対してページを遷移させるので少しややこしいですが、ルーティング定義の第1引数で指定されているURIは"移動先"ではありません。

    web.phpのルーティング定義の内容は、「第1引数で指定したURIに対してPOST・GETリクエストの送信があったら、第2引数の処理を実行する(コントローラーが指定されていれば、そのコントローラー@アクションに処理を振り分ける)」です。


    なので今回の
    Route::post('/drills', 'DrillsController@create')->name('drills.create');

    の読み解き方は、
    「第1引数で指定したhttp://~~~/drillsに対してPOST送信が行われたら、第2引数で指定したDrillsControllerのcreateアクションに振り分ける」となります。

    第一引数の'/drills'は"移動先"ではなく、あくまでPOSTリクエストの送信先です。
    レッスンの10-11でルーティングについて説明されていますので、再度復習してみてください。
    また、下記ブログ記事もLaravelのルーティングについて詳しく書かれているので参考にしてみてください。

    https://blog.capilano-fw.com/?p=556