Laravelにおけるルーティングを説明していきます。
#ルーティングとは
ブラウザから任意のURLアクセスがあった場合、どのController処理を動かすのかを定義するところになります。記述する場所はroutes/web.php
になります。またHTTPメソッド(GET,POST,PUT等)も定義できます。下記のイラストの①の部分にあたります。
#ルーティングの書き方
記載する場所はroutes/web.php
になります。
例) ブログ一覧を表示したい
Route::get('blogs','BlogContoller@showlist');
左から順に説明します。
- Laravel既存機能のRouteファサードを使う(Route)
- HTTPメソッドの指定(get)
- 任意のURLを指定(blogs)
- 作ったControllerを指定(BlogContoller)
- Controllerのメソッドを指定(showlist)
#名前付きルート
作成したRouteに名前をつける事ができます。これにより特定のルートへのURLを生成したり、リダイレクトしたりする場合に便利です。ルート定義にname
メソッドをチェーンする事で名前がつけられます。
Route::get('/','BlogContoller@showlist')->name('blogs');
###生成+リダイレクト
ルートに一度名前を付ければ、その名前をグローバルなroute
関数で使用すればURLを生成したり、リダイレクトしたりできます。
//URLの生成
$url = route('blogs');
//リダイレクトの生成
return redirect()->route('profile');
###URLを一括で変更できる
viewで
{{ url('/users/1/profile')}}
上記のように書いてしまうと、URLを変更する際にviewの中から同じ箇所を探さないといけなくなってしまいますが、
{{ route('user.profile',['id' => 1])}}
としていれば、routes/web.php
のみを変更すればよくなります。
##resource
resourceはリソースコントローラーと呼ばれ、一般的なCRUD(投稿、一覧、更新、削除、詳細)操作を予めLaravel側で用意してくれるものです。web.phpでHTTP動詞をRoute::resource
とする事で以下のメソッドを定義した扱いとなります。また、name()
も勝手に付与してくれます。
- index(一覧)
- show(詳細)
- create(作成画面)
- store(作成処理)
- edit(編集画面)
- update(編集処理)
- destroy(削除処理)
これにより、かなりのコード短縮化が図れます。
一つずつ
Route::get('admin/post', 'Admin/PostController@index')->name('admin.post.index');
Route::get('admin/post/show/{id}', 'Admin/PostController@show')->name('admin.post.show');
Route::get('admin/post/create', 'Admin/PostController@create')->name('admin.post.create');
Route::post('admin/post/store', 'Admin/PostController@store')->name('admin.post.store');
Route::get('admin/post/edit/{id}', 'Admin/PostController@edit')->name('admin.post.edit');
Route::post('admin/post/update/{id}', 'Admin/PostController@update')->name('admin.post.update');
Route::post('admin/post/destroy/{id}', 'Admin/PostController@destroy')->name('admin.post.destroy');
resource版
Route::resourcre('post','PostController');
また、以下のartisanコマンドで対応するコントローラとメソッドを自動生成してくれます。
$ php artisan make:controller PhotoController --resource
//コマンド入力で自動的に作成される
namespace App\Http\Controllers;
class PhotoController extends Controller
{
public function index()
{
//
}
public function create()
{
//
}
public function store(Request $request)
{
//
}
public function show($id)
{
//
}
public function edit($id)
{
//
}
public function update(Request $request, $id)
{
//
}
public function destroy($id)
{
//
}
}
###onlyオプション/exeptオプション
これにより、resource使った時のルーティングを制限する事ができるので、余計なルーティングを生成しないで済みます。
//edit,updateのルーティングを削除
//only
Route::resource('hoge', 'HogeController', ['only' => ['index','create','show','store','destroy']]);
//except
Route::resource('hoge', 'HogeController',[except => ['edit','update']]);
###resource懸念点
実務でresource
を使ってしまうと、使わないルートまで定義されてしまうので、「個別で書いた方がいい」、「only,exceptオプションを使う」という意見があるらしいです。使う用途によって使い分けた方が良さそうです。
#終わりに
参考サイト
https://qiita.com/sympe/items/9297f41d5f7a9d91aa11
https://qiita.com/namizatork/items/78487c2504b7ad4faf27