こんばんは、のるぼるのんです。彼此二週間位風邪が治りません。というわけで、今回も復習を兼ねて、Laravelのリダイレクトを確認したいと思います。
使うのは、先日作成した写経用のローカルシステム。
HTMLやJSを写経するのに、bladeファイルを用意したらそこまでの導線を自動で用意する、というやつです。
コントローラーの中身は今こんな感じです。
PlacticeController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\View; use File; class PlacticeController extends Controller { public function index() { $array = []; $path = resource_path('views/plactices/'); $files = File::files($path); foreach ($files as $file) { $array[] = basename($file, '.blade.php'); } return view('welcome', compact('array')); } public function detail($name) { if (View::exists("plactices/{$name}")) { $view = "plactices.{$name}"; return view($view); } $array = []; $path = resource_path('views/plactices/'); $files = File::files($path); foreach ($files as $file) { $array[] = basename($file, '.blade.php'); } return view('welcome', compact('array')); } } |
indexアクションで/resources/views/placticesの中に格納されているbladeファイルの名前を取得し、detailアクションに繋げる形です。
見て貰えばお分かりでしょうが、detailアクションの中に、indexアクションと同じことが書いてありますね。無駄ですのでリダイレクトアクションで記述し直します。
リダイレクトバック
現状、1~5.blade.phpおよび、hello.blade.phpが/resources/views/plactices中に格納されています。
welcome.blade.phpに、存在しないbladeまでのリンクを追記して、クリックしてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<div class="content"> <div class="title m-b-md"> Laravel </div> <div class="links"> @forelse ($array as $value) <a href="/{{ $value }}">Plactice:{{ $value }}</a> @empty 利用可能なページはありません @endforelse <a href="/error">Plactice:error</a> </div> </div> |
URLが/errorになっていますが、表示はindexアクションと変わりません。
リダイレクトアクションに書き直します。
1 2 3 4 5 6 7 8 9 |
public function detail($name) { if (View::exists("plactices/{$name}")) { $view = "plactices.{$name}"; return view($view); } return redirect()->back(); } |
これでbladeファイルが存在しない場合、リダイレクトバックされるようになりました。
別コントローラアクションへのリダイレクト
今は写経用のローカルシステムを使用していますので、メインページ→各bladeでの写経ページしか用意していませんが、システムによっては、条件次第で別のコントローラアクションへ飛ばしたい、という場合もあると思います。
その場合でもリダイレクトアクションで記述可能です。
今回は、errorをクリックした場合、別アクションに飛ばして、404表示してみます。
web.php
1 |
Route::get('/errors/{number}', 'PlacticeController@errors'); // 追記します |
PlacticeController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public function detail($name) { if (View::exists("plactices/{$name}")) { $view = "plactices.{$name}"; return view($view); } if ($name === 'error') { return redirect()->action('PlacticeController@errors', ['number' => 404]); //404を引数として渡しています } return redirect()->back(); } public function errors($number) { echo 'Errorをクリックしました。'; abort($number); // 404エラーを起こします。 } |
redirect()->action()で別コントローラーのアクションを呼び出すことが出来ます。また、actionメソッドは第二引数にパラメータを渡すことができますので、プロフィールや商品詳細などにも飛ばすことができます。
別サイトへのリダイレクト
別サイトへ飛ばすことも可能です。サイト間で登録情報を共有している場合や、商品IDを共有しているなどにも使えそうですね。今回はGoogleへのリンクを作成します。
welcome.blade.php
1 2 3 4 5 6 7 8 9 |
<div class="links"> @forelse ($array as $value) <a href="/{{ $value }}">Plactice:{{ $value }}</a> @empty 利用可能なページはありません @endforelse <a href="/error">Plactice:error</a> <a href="/google">Googleへ</a> </div> |
PlacticeController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public function detail($name) { if (View::exists("plactices/{$name}")) { $view = "plactices.{$name}"; return view($view); } if ($name === 'error') { return redirect()->action('PlacticeController@errors', ['number' => 404]); } if ($name === 'google') { // 外部リンクへ return redirect()->away('https://www.google.com'); } return redirect()->back(); } |
redirect()->away()で外部サイトへ飛ばすことができます。
外部リンクへの導線を作成する場合、HTMLにはなるべく情報を載せたくないので、コントローラー内で制御すると安心感が増しますね。
他にもLaravelのリダイレクトメソッドにはダウンロードや、PDFの表示、ファイル操作、フォーム入力値を保持したまま戻るなど、様々なメソッドがありますので、是非確認してみてください。
コメントを書く