はじめに
前回までの記事では、LaravelのMVCモデルのうち
- Model:データを扱う部分
-
View:画面を表示する部分
を学んできました。
今回はその2つをつなぐ司令塔である Controller を解説します。
Controllerはユーザーからのリクエストを受け取り、必要な処理を行って結果を返す役割を担っています。
MVCの中でも、アプリ全体の流れを整理する重要な役割です。
Controllerの基本的な役割
Controllerは、ユーザーの操作(リクエスト)に応じて適切な処理を実行し、ModelやViewを呼び出す「橋渡し役」です。
[ユーザーの操作]
↓
[Route]
↓
[Controller]
↙ ↘
[Model] [View]
リクエストを受け取る
↓
必要なデータをModelから取得する
↓
結果をViewに渡して表示する
この流れを整理することで、処理の見通しが格段に良くなります。
Controllerの作成と基本構造
作成コマンド
php artisan make:controller PostController
これで app/Http/Controllers/PostController.php が作成されます。
基本構成例
namespace App\Http\Controllers;
use App\Models\Post;
class PostController extends Controller
{
// 投稿一覧
public function index()
{
$posts = Post::all();
return view('posts.index', compact('posts'));
}
// 投稿詳細
public function show($id)
{
$post = Post::findOrFail($id);
return view('posts.show', compact('post'));
}
}
-
index():一覧表示 -
show():詳細表示
Controllerでは「どのデータをどの画面に渡すか」を明示するのが基本です。
Routingとの関係
ControllerはRoutingと密接に関係しています。
RoutingでURLとControllerメソッドを紐づけることで、Webアプリの操作が成り立ちます。
ルート定義例
use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/{id}', [PostController::class, 'show'])->name('posts.show');
-
/postsにアクセス →PostController@indexが実行 -
/posts/1にアクセス →PostController@showが実行
ルートに name() を付けておくと、ViewからURLを安全に生成できます。
<a href="{{ route('posts.show', $post) }}">{{ $post->title }}</a>
フォーム送信とController
前回(View編)で紹介したフォームを、Controllerで受け取る例を見てみましょう。
View側(posts/create.blade.php)
<form action="{{ route('posts.store') }}" method="POST">
@csrf
<label>タイトル</label>
<input type="text" name="title" value="{{ old('title') }}">
<label>本文</label>
<textarea name="body">{{ old('body') }}</textarea>
<button type="submit">保存</button>
</form>
Controller側(PostController.php)
use Illuminate\Http\Request;
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|max:100',
'body' => 'nullable|string',
]);
Post::create($validated);
return redirect()->route('posts.index')->with('status', '投稿を作成しました!');
}
-
$request… ユーザーの入力データを受け取る -
$request->validate()… バリデーション(入力チェック)を実行 - 成功時はリダイレクトし、フラッシュメッセージを設定
バリデーションの基本
Controllerはフォーム入力をチェックし、問題があればユーザーにエラーメッセージを返します。
ルールの書き方
$request->validate([
'title' => 'required|max:100',
'body' => 'nullable|string',
]);
エラー表示(View側)
@error('title')
<p style="color:red;">{{ $message }}</p>
@enderror
バリデーションエラー時は自動で前のページにリダイレクトし、入力値は old() で保持されます。
RESTfulなController設計
Controllerは1つのリソースに対して一定のメソッド構成を持つのが一般的です。
| メソッド | HTTP動詞 | 役割 |
|---|---|---|
| index | GET | 一覧表示 |
| show | GET | 詳細表示 |
| create | GET | 新規作成フォーム表示 |
| store | POST | 新規登録 |
| edit | GET | 編集フォーム表示 |
| update | PUT/PATCH | 更新処理 |
| destroy | DELETE | 削除処理 |
artisanコマンドで一括生成
php artisan make:controller PostController --resource
resourceルートでまとめて登録
Route::resource('posts', PostController::class);
これだけで上表のルートを自動登録できます。
大規模開発では、RESTful構成を基本にするとチームでの分担やAPI化もスムーズになります。
まとめ
- Controllerは「リクエストを受け取り、ModelとViewをつなぐ司令塔」
- Laravelでは
make:controllerコマンドで簡単に作成できる - フォーム送信やバリデーションを通じて、アプリ全体の流れを制御する役割を担う
🎉これで、LaravelのMVCシリーズ全4部が完結です🎉
MVCの仕組みを理解することで、Laravelの内部構造やアプリ開発の流れが一気に見通しやすくなります。
ぜひ今回学んだ内容をもとに、今後のアプリ開発に活かしてください!
宣伝
くすりの窓口ではエンジニアを積極採用中です!
ご興味のある方は下記リンクよりお問い合わせください!
学生向け
中途向け