LaravelのリソースコントローラでRESTfulなルートを定義する方法
生徒
「Laravelでリソースコントローラって何ですか?どうやって使うんでしょう?」
先生
「リソースコントローラは、よく使うルート(URLと処理の対応)をまとめて自動で作れる便利な仕組みです。特にRESTfulというルールに沿った作り方に最適ですよ。」
生徒
「RESTfulって何ですか?難しそうです…」
先生
「RESTfulは、Webアプリでデータを操作する決まりごとの一つです。URLやHTTPメソッド(GETやPOSTなど)を決まった形で使い、わかりやすく整理する方法です。」
先生
「では、LaravelのリソースコントローラでRESTfulなルートを作るやり方を見ていきましょう!」
1. RESTfulとは?基本の考え方
RESTful(レストフル)とは、WebアプリやWeb APIでデータをやり取りするときのお作法・ルールのようなものです。特に、URL(ルート)とHTTPメソッド(GET、POSTなど)を組み合わせて、「何をしたいのか」がひと目で分かるように整理する考え方を指します。
イメージとしては、本棚に本をきちんと並べてラベルを貼っておく感覚に近いです。適当に積み上げるのではなく、「一覧を見るときはここ」「新しく追加するときはここ」と決めておくことで、後から見ても迷子になりません。RESTfulな設計は、URLの意味や処理の役割をそろえることで、開発者同士でも分かりやすく共有できるのが大きなメリットです。
たとえば、ブログの記事(article)というデータを扱う場合は、次のようにURLとHTTPメソッドを整理します。
- 記事一覧を取得するときは「GET /articles」… 記事がずらっと並ぶ一覧ページを表示
- 新しい記事を作るときは「POST /articles」… フォームで入力した内容をサーバーに送って保存
- 特定の記事を見るときは「GET /articles/{id}」… 1件分の詳細ページを表示
- 記事を編集するときは「PUT /articles/{id}」や「PATCH /articles/{id}」… すでにある記事の内容を更新
- 記事を削除するときは「DELETE /articles/{id}」… 保存されている記事を削除
このように「URLはなるべく名詞(/articles のようなリソース名)」「何をするかはHTTPメソッド(GET、POST、PUT、DELETEなど)で表現する」というルールをそろえることで、APIやWebアプリの設計が統一され、あとからコードを読む人にとっても理解しやすくなります。
実際のリクエストのイメージは、次のようになります。
GET /articles # 記事一覧を表示したい
GET /articles/1 # ID=1 の記事を1件だけ表示したい
POST /articles # 新しい記事を1件登録したい
PUT /articles/1 # ID=1 の記事の内容をまるごと更新したい
DELETE /articles/1 # ID=1 の記事を削除したい
プログラミング未経験の方は、ここでは「URLの形とHTTPメソッドの組み合わせに意味がある」「同じ決まりでそろえると、Laravelのルーティングやリソースコントローラがぐっと分かりやすくなる」という点だけ押さえておけば十分です。
2. Laravelのリソースコントローラとは?
Laravelのリソースコントローラは、RESTfulの考え方に沿って「よく使う7つの基本操作」を自動でまとめて用意してくれる便利な仕組みです。本来なら、URLごとに個別でルートを書く必要がありますが、リソースコントローラを使うと、それらを一括で設定できるため、コード量も大幅に減らせます。
たとえばブログの記事を管理するとき、一覧を表示したり、新しい記事を登録したり、編集したりとさまざまな操作があります。リソースコントローラを使えば、これらの基本的な処理が「決まったメソッド名」として最初から準備されているので、初心者でも迷わず使い始められます。
実際に「ArticleController」を作成して登録すると、記事の一覧表示、作成フォームの表示、保存、詳細表示、編集、更新、削除といった基本操作に必要なメソッドが一気にそろいます。
イメージしやすいように、リソースコントローラに含まれるメソッドのざっくりした雰囲気をサンプルとして載せておきます。
class ArticleController extends Controller
{
public function index() // 記事を一覧で見たいとき
{}
public function create() // 新しい記事を作りたいとき
{}
public function store() // 作った記事を保存するとき
{}
public function show($id) // 記事の詳細を見たいとき
{}
public function edit($id) // 記事を編集したいとき
{}
public function update($id)// 記事を更新するとき
{}
public function destroy($id)// 記事を削除するとき
{}
}
このひな型が自動で作られるので、「どのメソッドに何を書くか」を悩まずにすむのが大きなポイントです。プログラミング未経験の方でも、まずはこの仕組みをそのまま使っていくだけで自然とRESTfulな構成に慣れていけるようになります。
3. リソースコントローラで作成される主なルート一覧
リソースコントローラを使うと、「一覧を見る」「新規作成する」「更新する」「削除する」といった基本操作に対応したルートがセットで自動生成されます。手作業で1行ずつルートを書かなくても、あらかじめ用意された決まりに従ってまとめて登録されるイメージです。
ブログの記事(articles)を例にすると、次のようにHTTPメソッドとURL、コントローラのメソッドが1対1で対応します。
| HTTPメソッド | URL | 処理内容 | コントローラのメソッド |
|---|---|---|---|
| GET | /articles | 記事の一覧表示(記事をずらっと並べて見る) | index |
| GET | /articles/create | 記事の新規作成フォーム表示(入力画面を開く) | create |
| POST | /articles | 記事の新規保存(フォームから送信された内容を登録) | store |
| GET | /articles/{id} | 記事の詳細表示(1件分だけ内容を表示) | show |
| GET | /articles/{id}/edit | 記事の編集フォーム表示(既存データ入りの入力画面を開く) | edit |
| PUT/PATCH | /articles/{id} | 記事の更新処理(編集フォームで変更した内容を保存) | update |
| DELETE | /articles/{id} | 記事の削除処理(指定した記事を削除) | destroy |
表の見方としては、「どのURLに、どのHTTPメソッドでアクセスしたときに、コントローラのどのメソッドが呼ばれるのか」を整理したものだと考えると分かりやすいです。たとえば「GET /articles」であれば一覧表示用のindexメソッド、「GET /articles/1」であればIDが1の記事の詳細を表示するshowメソッドが実行されます。
ざっくりとした流れのイメージを、サンプルとしてコード風に書くと次のようになります(実際のルート定義は後のセクションで扱います)。
// ブラウザからのリクエストと、呼び出されるメソッドのイメージ
// 記事一覧ページを開く
GET /articles → ArticleController@index
// 記事の詳細ページを開く(id=1 の場合)
GET /articles/1 → ArticleController@show
// 新しい記事を登録する
POST /articles → ArticleController@store
// 記事を更新する
PUT /articles/1 → ArticleController@update
// 記事を削除する
DELETE /articles/1 → ArticleController@destroy
プログラミング未経験の方は、まずは「URLのパターン」と「メソッド名」がセットで決まっている、という感覚だけつかんでおけばOKです。細かい書き方は一度に覚えなくても、何度か触れていくうちに自然と慣れていきます。
4. リソースコントローラの作成方法
リソースコントローラを使うための最初の一歩は、「コントローラのひな型ファイルを作ること」です。Laravelでは、ブラウザからぽちぽち作るのではなく、artisan(アーティザン)というコマンドを使ってサクッと自動生成します。
やることの流れはとてもシンプルで、次のようなイメージです。
- ① Laravelプロジェクトのフォルダに移動する
- ② ターミナル(またはコマンドプロンプト)を開く
- ③ コマンドを1行打って実行する
今回は、ブログ記事を管理するための「ArticleController」というリソースコントローラを作成してみます。
php artisan make:controller ArticleController --resource
このコマンドを実行すると、app/Http/Controllers/ArticleController.php というファイルが自動で作られます。中身を開いてみると、すでに index、create、store、show、edit、update、destroy の7つのメソッドが空の状態で用意されており、あとは自分の処理を書き足していくだけ、という状態になっています。
試しに、作成されたコントローラの index メソッドに、簡単なメッセージを返すコードを書いてみると雰囲気がつかみやすくなります。
class ArticleController extends Controller
{
public function index()
{
// 本来はここで記事一覧のデータを取得してビューに渡す
// まずは動作確認用にシンプルな文字列を返してみる
return '記事一覧ページのイメージです';
}
// 他の create / store / show などのメソッドも
// このファイルの中にあらかじめ用意されています
}
このように、リソースコントローラを作成するコマンドを一度覚えてしまえば、あとは用意されたメソッドに処理を書いていくだけで、記事一覧や詳細表示、編集といった機能を段階的に追加していけます。プログラミング初心者の方も、「まずはコントローラを自動生成する」という流れから慣れていきましょう。
5. ルートファイルでリソースコントローラを登録する方法
リソースコントローラを作成したら、次は「ルートファイルに登録する」ことで、ブラウザからアクセスできるようになります。Laravelでは routes/web.php にルートを書き込むのが基本で、ここに1行追加するだけで、先ほど作った7種類のルートがまとめて登録されます。
ルートとは、簡単に言うと「どのURLにアクセスしたら、どのコントローラのどのメソッドを呼ぶか」という地図のようなものです。これを設定しないと、せっかく作ったコントローラも動きません。
use App\Http\Controllers\ArticleController;
// 「articles」というURLにアクセスしたときの一式のルートをまとめて登録
Route::resource('articles', ArticleController::class);
Route::resource() を使うと、一覧表示・詳細表示・新規作成・更新・削除といった基本操作がすべて自動で紐づけられます。もしこれを手書きで1つずつ設定すると7行以上必要になるため、初心者ほどこの仕組みを使うメリットを強く実感できるはずです。
たとえば、GET /articles にアクセスすると ArticleController@index が呼ばれ、POST /articles にアクセスすると store メソッドが実行される、といった動きが裏側で整備されます。ルート設定を覚える最初のステップとして、この自動登録の仕組みはとても分かりやすく、学習の土台にもなります。
動作確認したい場合は、ブラウザで /articles にアクセスしてみて、先ほど index メソッドに書いたメッセージが表示されるか試してみると理解が深まります。
6. ルート名(名前付きルート)について
リソースコントローラのルートには、名前が自動でつきます。名前付きルートを使うと、URLを直接書かずに呼び出せるので便利です。
例:
route('articles.index'); // 記事一覧ページのURLを取得
route('articles.show', ['article' => 1]); // id=1の記事詳細ページのURLを取得
名前付きルートはビューやリダイレクトなど、いろいろな場面で使われます。
7. 必要なメソッドだけを指定する方法
もし全てのルートを作りたくない場合は、使うメソッドだけを指定できます。
Route::resource('articles', ArticleController::class)->only([
'index', 'show'
]);
これで「記事一覧(index)」と「詳細表示(show)」だけのルートが登録されます。
8. リソースコントローラでRESTfulなルートを簡単に定義しよう
まとめると、LaravelのリソースコントローラはRESTfulなWebアプリを作るときに、よく使うルートを一括管理し、効率よくコーディングできる便利な機能です。URLのルールやHTTPメソッドを意識しなくても、きれいに整理されたルートが簡単に作成できます。
プログラミング初心者の方でも、まずはphp artisan make:controller --resourceでコントローラを作り、Route::resourceで登録して動きを確認してみましょう。
まとめ
Laravelのリソースコントローラは、RESTfulな設計の考え方に自然に沿った形でルートをまとめて扱える非常に便利な仕組みです。ふだんWebアプリを作ると、記事や商品やユーザーなど、同じような流れで「一覧表示」「新規作成」「保存」「詳細表示」「編集」「更新」「削除」といった処理が必要になります。これらを毎回手動でルートファイルに書いていくと、数が増えるにつれて管理が難しくなり、間違いや重複も発生しがちです。しかし、Laravelではリソースコントローラを使うことで、一つのコントローラの中に七つの基本的な処理をまとめ、さらにルートも自動生成できるため、とても整理された状態で開発を進めることができます。
とくに、RESTfulなルート設計は「URLの形」「HTTPメソッドの種類」「処理内容」がわかりやすく紐づくため、あとからコードを読む人にとっても理解しやすく、無駄のない美しいルーティングを実現できます。たとえば記事一覧は「GET /articles」、新規保存は「POST /articles」、更新は「PUT /articles/{id}」、削除は「DELETE /articles/{id}」というように、どのURLで何をするかがひと目でわかります。これは小規模なアプリだけでなく、大人数で開発するプロジェクトや、APIを提供するようなケースでも役に立つ考え方です。
また、Laravelではartisanコマンドでリソースコントローラを一瞬で作成できるため、初心者でもすぐに実践できます。コントローラを作ると、中にはindexやstoreといったメソッドがあらかじめ準備されているので、自分のアプリの用途に合わせて中身を書き換えるだけで動かせます。さらにルートファイルでRoute::resourceを使えば自動的にRESTfulなルートが登録されるため、URLの書き忘れや重複も防げます。名前付きルートも自動で付くので、ビューから呼び出したり、コントローラからリダイレクトする際にも非常に扱いやすい構造になります。
もし全てのメソッドを使わない場合も、onlyやexceptで必要なルートだけを抽出できるため、余計なエンドポイントを増やさず効率的に開発できます。こうした柔軟さはLaravelの大きな魅力であり、初心者から経験者まで幅広く活用できるポイントです。リソースコントローラを正しく理解し活用すれば、プロジェクト全体の構造が整い、保守性も向上し、コーディングミスも減らせます。実際の開発では、記事や商品、ユーザーといった「同じような流れでデータを扱う部分」が多いため、この仕組みを知っておくだけで開発の効率が大きく変わります。
RESTfulなルート設計は、最初は難しそうに感じるかもしれませんが、慣れるととても論理的で使いやすく、アプリ全体の設計が引き締まっていきます。Laravelのリソースコントローラは、その設計思想を簡単に形にできる強力な機能ですので、今回の内容をきっかけに、自分のアプリにも積極的に取り入れ、ルートと処理の整理を進めてみてください。URLとコントローラの動きがきれいに整う心地よさを感じながら開発できるはずです。
サンプルプログラム:記事一覧を表示する簡単な実装例
use App\Http\Controllers\ArticleController;
use App\Models\Article;
Route::get('/articles', function () {
$articles = Article::orderBy('created_at', 'desc')->get();
return view('articles.index', compact('articles'));
});
生徒
「きょうはリソースコントローラの働きがよくわかって、とても整理された作りになることを実感しました。URLと処理が統一されていると、どこに何を書けばいいのか迷わなくて済みますね。」
先生
「そうですね。RESTfulな設計を身につけると、Laravelだけでなく他のフレームワークにも応用できますよ。リソースコントローラを使うことで、開発の流れが自然と決まっていきます。」
生徒
「名前付きルートが自動で付くのも便利でした。ビューからのリンクも作りやすくて、URLを変更しても対応しやすいですね。」
先生
「その通りです。実務ではURL構造が変わることもありますが、名前付きルートを使っていれば、変更の影響を最小限にできます。これもリソースコントローラの利点ですね。」
生徒
「全部のメソッドを使わないときに、onlyで必要なものだけ選べるのも助かります。余計なルートを増やしたくないときに使えますね。」
先生
「その使い分けができれば、さらに柔軟な設計ができるようになりますよ。今後は実際のアプリで使いながら、より深く理解していきましょう。」