CLOSE
MENU
Laravel 基礎学習/Route の仕組みと書き方

Laravel 基礎学習/Route の仕組みと書き方

Laravel の Route は、URL と処理を結びつけるための重要な仕組み。
本記事では、Laravel Route の基本的な仕組みと書き方を解説する。

Route とは

Laravel では、
基本的に以下の流れで処理が行われる。

ブラウザアクセス

Route
URL に対応する Controller を決定

Controller
必要な処理を実行

Model
DB操作が必要な場合に利用する

View
ブラウザへ表示する HTML を生成

ブラウザへ表示

Laravel の Route は、
ユーザーからのリクエスト時に最初に通る処理。

Route では、

などを行う。

Laravel では、
ユーザーがブラウザでアクセスした URL に対して、
どの機能を実行するかを Route が決定する。

例えば、

https://example.com/posts

にアクセスされた場合、
Route が投稿一覧を表示する Controller を呼び出し、
一覧画面を表示する処理を実行する。

Route は、
URL に応じて実行する処理を振り分ける案内窓口のような役割を持つ。

Route ファイルの置き場所

Laravel では、プロジェクト作成時に
Route ファイルが routes フォルダ内に自動で作成される。

routes フォルダには、
web.php や api.php などの Route ファイルがあり、
用途に応じて使い分ける。

例えば、

composer create-project laravel/laravel my-app

を実行すると、
以下のような Laravel プロジェクト一式が自動作成される。

my-app
 ├ app
 ├ bootstrap
 ├ config
 ├ database
 ├ public
 ├ resources
 ├ routes
 ├ storage
 └ vendor

下記の Route ファイルが、
この中の routes フォルダ内へ配置される。

routes
 ├ web.php
 ├ api.php
 ├ channels.php
 └ console.php

これらの Route ファイルは、
ブラウザからアクセスがあった時に、
Laravel が自動で読み込む。

Laravel は、
Route ファイルを確認し、
どの URL にどの処理を対応させるかを判定している。

一般的な Web アプリ開発では、

web.php
api.php

を使用するケースが多い。

web.php

web.php は、
ブラウザで表示する通常の Web ページ用 Route を書くファイル。

一般的な Web アプリの画面表示やフォーム送信処理などは、
基本的に web.php に書く。

api.php

api.php は、
API 用 Route を書くファイル。

主に JSON データを返す処理を書く。

channels.php

channels.php は、
WebSocket やリアルタイム通信関連の設定を書くファイル。

チャット機能や通知機能などで使用する。

console.php

console.php は、
Artisan コマンドや定期実行処理関連を書くファイル。

ブラウザアクセス用 Route とは用途が異なる。

Route の基本構文

Route は、以下のような形で書く。

Route::HTTPメソッド('URL', 処理);

use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index']);

1行目 use の意味

この Route から使用したい Controller のファイルを指定している。
これを書くことで、 Route 内で PostController を使用できる。

2行目 Route::get() の意味

/posts に GET でアクセスされたら、
PostController の index メソッドを実行する。
1行目の記述がないとこれが動かない。

ここで例に挙げた PostController は、
Controller と呼ばれる役割を持つ PHP ファイル。

Controller は、 Route から呼び出され、ページを表示する前に必要な処理を行う。

つまり、
案内窓口である Route が、
「この URL にアクセスされたら PostController の処理を実行する」
と振り分けを行い、
実際の処理は Controller 側で行われる、
という流れ。

なお、今回の例はブラウザで画面を表示する一般的な Web アプリの処理なので、

routes/web.php

に記載する。

HTTP メソッド別 Route

HTTP メソッドとは、
ブラウザが「何をしたいのか」をサーバーへ伝えるための種類。

Laravel の Route では、
URL だけではなく、
HTTP メソッドも使って処理を振り分ける。

例えば、
同じ URL でも、

によって、
実行する処理が変わる。

そのため Laravel では、
HTTP メソッドごとに Route を書き分ける。

GET Route

GET は、
画面表示に使用する HTTP メソッド。

投稿一覧画面や投稿詳細画面など、
ブラウザでページを開く処理に使う。

Route::get('/posts', [PostController::class, 'index']);

意味

/posts に GET でアクセスされたら、
PostController の index メソッドを実行する。

よく使う場面

POST Route

POST は、
新しいデータを登録する時によく使う HTTP メソッド。

フォームから送信された内容を DB に保存する処理に使う。

Route::post('/posts', [PostController::class, 'store']);

意味

/posts に POST で送信されたら、
PostController の store メソッドを実行する。

よく使う場面

PUT / PATCH Route

PUT / PATCH は、
既存データを更新する時によく使う HTTP メソッド。

Laravel では、
更新処理に PUT または PATCH を使用することが多い。

Route::put('/posts/{id}', [PostController::class, 'update']);

意味

/posts/{id} に PUT で送信されたら、
PostController の update メソッドを実行する。

よく使う場面

DELETE Route

DELETE は、
既存データを削除する時によく使う HTTP メソッド。

Route::delete('/posts/{id}', [PostController::class, 'destroy']);

意味

/posts/{id} に DELETE で送信されたら、
PostController の destroy メソッドを実行する。

よく使う場面

10)Route の順番に注意

Route は、上から順番に判定される。
そのため、書く順番が重要になる場合がある。

Route::get('/posts/create', [PostController::class, 'create']);
Route::get('/posts/{id}', [PostController::class, 'show']);

この順番なら問題ない。

しかし、逆に書くと、

/posts/create

が、

/posts/{id}

に一致してしまう可能性がある。

つまり Laravel が、

create

を id として扱ってしまう可能性がある。

そのため、

/posts/create

のような固定 URL は、

/posts/{id}

のような可変 URL より先に書くことが多い。

Route 名

Route には名前を付けることができる。

Route::get('/login', [LoginController::class, 'index'])->name('login');

この場合、

/login

の Route に、

login

という名前を付けている。

Route 名を使わない場合

<a href="/login">ログイン</a>

このように、
URL を直接書くことになる。

Route 名を使う場合

<a href="{{ route('login') }}">ログイン</a>

route(‘login’) を使うと、
Route 名から URL を自動生成できる。

なぜ使うのか

URL を直接書くと、
後から URL を変更した時に修正箇所が増える。

例えば、

/login
/user/login

に変更した場合、
URL を直接書いている箇所を全て修正する必要がある。

しかし、
Route 名を使っていれば、
Route 定義側だけ修正すれば済む。

Route グループ

Route グループを使うと、
共通の URL や設定をまとめて書くことができる。

Route が増えてくると、
同じ記述を何度も書く場面が増える。

そのような場合に、
Route グループを使用すると管理しやすくなる。

prefix

prefix は、
URL の共通部分をまとめるために使う。

通常の書き方

Route::get('/admin/posts/create', [AdminPostController::class, 'create']);

Route::post('/admin/posts', [AdminPostController::class, 'store']);

このように、

/admin

を毎回書く必要がある。

prefix を使う場合

Route::prefix('admin')->group(function () {

    Route::get('/posts/create', [AdminPostController::class, 'create']);

    Route::post('/posts', [AdminPostController::class, 'store']);

});

この場合、
実際の URL は以下になる。

/admin/posts/create

/admin/posts

prefix を使うことで、

/admin

を共通化できる。

また、グループ化することで、「この Route 群は管理画面用」ということが視覚的にも分かりやすくなる。

name

name は、
Route 名の共通部分をまとめるために使う。

Route::name('admin.')->group(function () {

    Route::get('/posts', [AdminPostController::class, 'index'])->name('posts.index');

});

この場合、
Route 名は以下になる。

admin.posts.index

prefix と name を組み合わせる例

Route::prefix('admin')
    ->name('admin.')
    ->group(function () {

        Route::get('/posts', [AdminPostController::class, 'index'])->name('posts.index');

    });

この場合、

URL

/admin/posts

Route 名

admin.posts.index

になる。

このように Route グループを使用すると、
URL や Route 名の共通部分をまとめて管理できる。

また、

admin

という共通ルールを付けることで、
「管理画面用の Route」
ということも視覚的に分かりやすくなる。

Resource Route

Laravel では、
CRUD 用の Route をまとめて登録することができる。

CRUD とは、
データ操作でよく使う基本機能のこと。

一般的な Web アプリでは、
これらの機能をセットで作ることが多い。

例えば、
投稿機能を作る場合、

などの機能が必要になる。

これらを通常通り書くと、
Route が大量になる。

通常の書き方

Route::get('/posts', [PostController::class, 'index']);

Route::get('/posts/create', [PostController::class, 'create']);

Route::post('/posts', [PostController::class, 'store']);

Route::get('/posts/{id}', [PostController::class, 'show']);

Route::get('/posts/{id}/edit', [PostController::class, 'edit']);

Route::put('/posts/{id}', [PostController::class, 'update']);

Route::delete('/posts/{id}', [PostController::class, 'destroy']);

Laravel では、
これらをまとめて登録できる。

Resource Route の書き方

Route::resource('posts', PostController::class);

これだけで、
CRUD 用 Route が自動登録される。

対応する Controller メソッド

Resource Route は、
以下の Controller メソッドと対応している。

メソッド名 役割 URL 例
index 一覧表示 /posts
create 作成フォーム表示 /posts/create
store 登録処理 /posts
show 詳細表示 /posts/1
edit 編集フォーム表示 /posts/1/edit
update 更新処理 /posts/1
destroy 削除処理 /posts/1

このように、
Laravel では CRUD の基本構成がある程度決まっている。

そのため、

Route::resource()

を使うことで、
一般的な CRUD 用 Route をまとめて定義できる。

Route 一覧を確認する

登録されている Route を確認するには、
以下のコマンドを使用する。

Laravel では、
「Artisan(アーティザン)」と呼ばれる専用のコマンドツールが用意されている。

ターミナルで、

php artisan ○○

のような形式で実行することで、
Laravel の各種機能を操作できる。

Route 一覧を確認する場合は、

php artisan route:list

を使用する。

実行場所

このコマンドは、
ターミナルで Laravel プロジェクトフォルダへ移動した状態で実行する。

cd ~/Herd/my-app

php artisan route:list

確認できること

実行結果例

GET    posts        posts.index    PostController@index

POST   posts        posts.store    PostController@store

GET    posts/{post} posts.show     PostController@show

route:list を使う利点

Route が増えてくると、
「どの URL が登録されているのか」
「どの Controller が実行されるのか」
が分かりづらくなる。

そのような場合に、

php artisan route:list

を使うことで、
現在 Laravel に登録されている Route を一覧で確認できる。

URL の登録ミス確認や、
Route 名確認、
Resource Route で自動生成された Route 確認などでもよく使用される。

Route と View の関係

Laravel では、
基本的に以下の流れで処理が行われる。

Route
↓
Controller
↓
View

まず、
Route が URL を受け取り、
実行する Controller を決定する。

Controller では、
DB アクセスやログイン判定などの必要な処理を行い、
最後に View を返す。

View は、
画面表示用ファイルのこと。

HTML や Blade テンプレートなどを書き、
ブラウザへ表示する画面を作成する。

ただし、
Laravel では、
Controller を経由せず、
Route から直接 View を返すこともできる。

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

この場合、

/about

にアクセスすると、

resources/views/about.blade.php

が表示される。

Laravel では、画面表示用ファイルとして「ファイル名.blade.php」を使用する。

このように、
小さいページであれば、
Route から直接 View を返しても問題ない。

ただし、
実際のアプリでは、

などの処理が必要になることが多い。

そのため、
実際の Laravel 開発では、
Route から Controller を呼び出し、
Controller 側で処理を行う構成が一般的。

Controller を使う例

Route::get('/posts', [PostController::class, 'index']);

この場合、

/posts

にアクセスすると、
PostController の index メソッドが実行される。

まとめ:Route の役割

Route は、
ユーザーからのリクエストを受け取り、
実行する処理を振り分ける仕組み。

Laravel では、
ブラウザからのアクセスは、
まず Route を通る。

Route によって、

が決定される。

Route を理解すると、
Laravel アプリ全体の処理の流れがかなり分かりやすくなる。