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