Laravelでは、routeに名前を付けることができます。いったいそれがどうした?と思いますが、これができることで便利なことが増えます。

まず、routeの名前の付け方から、


Route::get('admin/ranking/download', 'RankingController@download');

routes.phpに指定して、

php artisan route:list

を実行すると、

+--------+-----------+-------------------------+------------------------+-------------------------------------------------------+
| Domain | Method    | URI                     | Name                   | Action                                                |
+--------+-----------+-------------------------+------------------------+-------------------------------------------------------+
|        | GET|HEAD  | admin/ranking/download  |                        | App\Http\Controllers\Admin\RankingController@download |

を出力します。3列名のNameの列に注目してください。

今は空ですね。

しかし、


Route::get('admin/ranking/download', 'RankingController@download')->name('admin.ranking.download');

とすると、

+--------+-----------+-------------------------+------------------------+-------------------------------------------------------+
| Domain | Method    | URI                     | Name                   | Action                                                |
+--------+-----------+-------------------------+------------------------+-------------------------------------------------------+
|        | GET|HEAD  | admin/ranking/download  | admin.ranking.download | App\Http\Controllers\Admin\RankingController@download |

admin.ranking.downloadと名前が付きます。

現在は、URIのスラッシュ(/)をピリオド(.)に置き換えたフォーマットですが、admin:ranking_downloadでも、admin::rankingdownloadでもOKです。

さて、routeにresourceを使用するときはどうなるのでしょう?

例えば、

Route::resource('product', 'ProductController');

は、

+--------+-----------+------------------------------------+------------------------+-----------------------------------------------------------------------+-----------------+
| Domain | Method    | URI                                | Name                   | Action                                                                | Middleware      |
+--------+-----------+------------------------------------+------------------------+-----------------------------------------------------------------------+-----------------+
|        | POST      | admin/product                      | admin.product.store    | App\Http\Controllers\Admin\ProductController@store                    | web             |
|        | GET|HEAD  | admin/product                      | admin.product.index    | App\Http\Controllers\Admin\ProductController@index                    | web             |
|        | GET|HEAD  | admin/product/create               | admin.product.create   | App\Http\Controllers\Admin\ProductController@create                   | web             |
|        | GET|HEAD  | admin/product/{product}            | admin.product.show     | App\Http\Controllers\Admin\ProductController@show                     | web             |
|        | DELETE    | admin/product/{product}            | admin.product.destroy  | App\Http\Controllers\Admin\ProductController@destroy                  | web             |
|        | PUT|PATCH | admin/product/{product}            | admin.product.update   | App\Http\Controllers\Admin\ProductController@update                   | web             |
|        | GET|HEAD  | admin/product/{product}/edit       | admin.product.edit     | App\Http\Controllers\Admin\ProductController@edit                     | web             |
+--------+-----------+------------------------------------+------------------------+-----------------------------------------------------------------------+-----------------+

と自動で名前を付けてくれます。

routeに名前が付いたところで、どう使用するか見てみましょう。

echo route('admin.ranking.download');

は、

http://localhost/admin/ranking/download

となります。もちろん、localhostはライブ環境では実際のドメイン名となります。

ということは、

echo url('admin/ranking/download');

と同じになります。

引数があるときは、

echo route('admin.product.edit', 12);
echo url('admin/product', [12, 'edit']);

の出力は、両方とも、

http://localhost/admin/product/12/edit

となりますが、名前付きの方がわかりやすいですね。

このroute()は、

return redirect()->route('admin.product.show', 12);

のようにリダイレクトや、


{!! Form::open(['route' => ['admin.product.store'], 'method' => 'post']) !!}

のようにテンプレートでも使用可能です。

もちろん、名前付きのrouteをプログラムで使用するなら、そのrouteのURIを変えても何もプログラムで変更は要らないことになります。便利ですね。

さらに、URIに比べて比較的扱いやすい文字列なので、名前付きのrouteに対してユーザーの権限をDBで定義すれば、例えば、ログインしたユーザーの役割により、特定のrouteを実行するかどうかの権限の判断にも使用可能です。将来、この連載で扱う予定のトピックです。

By khino