Laravelでルーティングの書き方まとめ

Laravelでルーティングの書き方まとめ

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"
    });
});

アプリケーションカテゴリの最新記事