2024.06.12
【Laravel】ルーティングのあれこれ

UnsplashAleksandr Ereminが撮影した写真

はじめに

Laravelのルーティングに関して、あれこれまとめたページです。

web.phpから直接Viewを返す

Route::get('/', function () {
    return view('welcome');
});

基本のルーティング

もっともシンプルなルーティング

<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UsersController;  // コントローラ読み込み

Route::get('/', [UsersController::class, 'index']);
// Route::get('パス', [コントローラ名::class, 'アクション名']);

ルーティングの省略形(7つの基本ルーティングを1行で記述する)

下の表中「※ルーティング※」列に記載の7つのルーティングを次の1行記述するだけで定義できます。

Route::resource('posts', PostsController::class);
メソッドURIアクション名ルート名※ルーティング※
GET/postsindexposts.indexRoute::get(‘posts’,               [PostController::class, ‘index’]);
GET/posts/{id}showposts.showRoute::get(‘posts/{id}’,        [PostController::class, ‘show’]);
GET/posts/createcreateposts.createRoute::get(‘posts/create’,    [PostController::class ‘create’]);
POST/postsstoreposts.storeRoute::post(‘posts’,              [PostController::class, ‘store’]);
GET/posts/{id}/editeditposts.editRoute::get(‘posts/{id}/edit’, [PostController::class, ‘edit’]);
PUT
/PATCH
/posts/{id}updateposts.updateRoute::put(‘posts/{id}’,         [PostController::class, ‘update’]);
Route::patch(‘posts/{id}’,     [PostController::class, ‘update’]);
DELETE/posts/{id}destroyposts.destroyRoute::delete(‘posts/{id}’,    [PostController::class, ‘destroy’]);

参考ページ:https://readouble.com/laravel/11.x/ja/controllers.html#actions-handled-by-resource-controller

■補足⓵:7つ全部ではなく一部のみ定義したい場合にも使えます。

内容ルーティング
基本ルーティング7つを1行で定義Route::resource(‘posts’, PostsController::class);
基本7つの内の一部を定義
(例ではindex, showのみを定義)
Route::resource(‘posts’, PostsController::class)->only([
‘index’, ‘show’
]);
基本7つの内の一部を除外して定義
(例ではcreate, store, update, destroy以外を定義)
Route::resource(‘posts’, PostsController::class)->except([
‘create’, ‘store’, ‘update’, ‘destroy’
]);

■補足⓶:コントローラの生成コマンド

以下のように–resourceをつけると、7つのアクションが定義されたコントローラが生成されるので便利です。

php artisan make:controller PostsController --resource

ルーティングをコマンドで確認する

認証機能などのライブラリを導入すると、自分の把握していないルーティングがされていることもあります。

そんな時に定義済みのルート一覧を確認するコマンドが以下です。

php artisan route:list

認証済み(ログイン済み)のみ許可する

■1行のみの場合

以下のように「->middleware(‘auth’)」を付けるだけです。

Route::get('/users', [ UserController::class, 'index' ])->name('users.index')->middleware('auth');

■複数行の場合

Route::middleware('auth')->group(function(){
  ~~ここに任意のルートを記述する~~
  Route::get( '/users',  [UserController::class, 'index']);  // ⇐例
})

未定義のルーティングにアクセスした際の処理を定義

Route::fallback(function(){
  return redirect('/')    // リダイレクトする場合
  // abort(404);           // 404エラーを返す場合
}

ルーティングのパスにprefixをつける

パスを省略する書き方です。

// ルーティング①
Route::prefix('users/{id}')->group(function () {
        Route::post('follow', [UserFollowController::class, 'store'])->name('user.follow');
 });

// ルーティング②
Route::post('/users/{id}/follow', [UserFollowController::class, 'store'])->name('user.follow');

 

ルーティングについては以上です。