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を実行するかどうかの権限の判断にも使用可能です。将来、この連載で扱う予定のトピックです。
メルマガ購読の申し込みはこちらから。