1.ルーティングとは
Webアプリケーションのデザインパターンの基本的な考え方の一つに、MVCモデル(Model-View-Controler)がありますが、ここでのルーティング とはURLとサーバ上のリソースを結びつける仕組みのことを差します。
昨今のWebアプリケーションフレームワークはMVC(派生モデルモ含む)モデルですが、基本的にどこかにこのルーティング を定義するファイルがあります。
Laravelの場合は./routes/web.php
になります。
参考URL:https://readouble.com/laravel/5.7/ja/routing.html
2.ルーティングの記載方法
2.1.Viewへのルーティング
デフォルトでは1つのルーティングのみが設定されています。このルーティングは、Laravelのウェルカムページ(インストール後にブラウザからアクセスして表示されるページ)のルーティングになります。
Route::get('/', function () {
return view('welcome');
});
2.2.Controllerへのルーティング(パラメータなし)
コントローラへのルーティング の場合記載は下記になります。
Route::get('/user', 'UserController@index');
//Route::get('/user', 'コントローラファイル名@ルーティング先関数名');
一段ディレクトリ 階層が深い場合の記載は下記になります。
Route::get('blogs/add', 'ディレクトリ\UserController@index');
getだけでなく、Httpの各メソッドに対して関数が用意されています。
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
複数のパターンを許可する場合は、matchやanyを利用します。
Route::match(['get','post'],'/',function(){});
Route::any('foo',function(){});
2.3.Controllerへのルーティング(パラメータあり)
2.3.1.必須パラメータを渡す場合
単一パラメータを渡す場合
Route::get('user/{id}', function ($id) {
return 'User'.$id;
});
複数パラメータを渡す場合
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
2.3.2.任意パラメータを渡す場合
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
2.3.3.パラメータに制約を指定する場合
正規表現で、パラメータに制約をかけることができます。
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
Route::get('user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
Route::get('user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
2.4.Controllerへのルーティング(名前の生成)
ルーティング で名前を指定しておけば、リダイレクトなどの処理をコントローラに記載する際、URLを直接記載する必要がなくなりますので、仕様変更などに柔軟に対応できます。
2.4.1.asを利用して指定
Route::get('user/profile', ['as' => 'profile', 'uses' => 'UserProfileController@show']);
2.4.2.nameを利用して指定
Route::get('user/profile', 'UserProfileController@show')->name('profile');
2.5.リダイレクト
他のURIへリダイレクトするルートを定義する場合は、Route::redirect
メソッドを使用します。
Route::redirect('/here', '/there'); //デフォルトステータスコード302を返す
Route::redirect('/here', '/there', 301); //ステータスコードを指定して返す
2.6.グループ化
2.6.1.入力フォームでグループ化
画面の入力フォームごとにルーティングを管理したい時に利用します。
Route::group(['as' => 'userform::'], function() {
Route::post('users/add', 'UserController@add');
Route::post('users/edit', 'UserController@edit');
Route::post('users/save', 'UserController@save');
}
2.6.2.利用するミドルウェアでグループ化
利用するミドルウェアでグループ化したい時に利用します。
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// firstとsecondミドルウェアを使用
});
Route::get('user/profile', function () {
// firstとsecondミドルウェアを使用
});
});
2.6.3.使用する名前空間でグループ化
コントローラの配置先ディレクトリ ごとにグループ化したい時に利用します。
Route::namespace('Admin')->group(function () {
// "App\Http\Controllers\Admin"名前空間下のコントローラ
});
2.6.4.使用するドメイン名でグループ化
管理者ページを別ドメインで構築している場合など、
アクセス元のドメイン毎にグループ化したい時に利用します。
Route::domain('{account}.myapp.com')->group(function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
2.6.5.URLのprefixでグループ化
管理者ページを別prefixで構築している場合など、
URLのprefixでグループ化したい時に利用します。
Route::prefix('admin')->group(function () {
Route::get('users', function () {
// http://www.xxx.com/admin/users"
});
Route::get('blogs', function () {
// http://www.xxx.com/admin/blogs"
});
});