Laravelを学び始めると、早い段階でControllerが出てきます。php artisan make:controller でファイルを作れることは分かっても、そこに何を書けばよいのかで手が止まることがあります。
Routeにも処理を書ける。Controllerにも書ける。Modelもある。Viewもある。さらにRequestという言葉も出てくる。初心者が迷うのは自然です。
この記事では、LaravelでControllerを作る前に知っておきたい役割分担を整理します。難しい設計論ではなく、Route、Controller、Model、View、Requestをどう分けて考えると理解しやすいかを、短いコード例で見ていきます。
Controllerで迷うのは、何でも書けてしまうから
Laravelでは、簡単な処理なら routes/web.php に直接書くこともできます。学習の最初は、それで動きを確認する方が分かりやすい場面もあります。
ただ、画面が増えたり、データベースから値を取ったり、フォーム送信を受けたりすると、Routeの中だけで処理するのは苦しくなります。そこでControllerを使います。
ここでつまずきやすいのは、Controllerにもいろいろ書けてしまうことです。データ取得、条件分岐、表示用データの整形、保存処理、エラー処理。全部書こうと思えば書けます。
しかし、全部をControllerに集めると、すぐに読みにくくなります。最初は細かい設計パターンを覚えるより、次のようにざっくり分けるだけで十分です。
- Routeは入口
- Controllerは処理の流れを組み立てる場所
- Modelはデータを扱う場所
- Viewは表示する場所
- Requestは入力を受け取る入口
この分け方が見えてくると、Controllerに何を書くかも決めやすくなります。
Controllerの役割は、リクエストを受けて次へ渡すこと
Controllerは、Routeから呼ばれて、必要な処理を組み立て、最後にレスポンスを返す場所です。
たとえば投稿一覧ページなら、Controllerは「投稿一覧を表示したい」というリクエストを受け取ります。そしてModelから投稿データを取得し、Viewへ渡します。
このときControllerが担当するのは、全体の流れです。
- どの入力を受け取るか
- どのModelからデータを取るか
- どのViewへ渡すか
- 最後に何を返すか
Controllerは、アプリの処理を全部抱え込む場所ではなく、リクエストからレスポンスまでをつなぐ場所です。
初心者のうちは、Controllerを「交通整理役」と考えると分かりやすいです。Routeから来たものを受け取り、必要な相手に渡し、Viewやリダイレクトとして返す。まずはこの感覚で十分です。
Route、Model、View、Requestとの違いを分けて考える
Controllerの役割を理解するには、周りのファイルとの違いを見るのが早いです。Laravelでは、それぞれが完全に独立しているというより、役割を分担しながら一つの処理を作ります。
Routeは「どのURLで何を呼ぶか」を決める
Routeは、URLと処理の対応を決める入口です。たとえば /posts にアクセスされたら PostController の index メソッドを呼ぶ、という対応を書きます。
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
Route::get('/posts', [PostController::class, 'index']);ここで大事なのは、Routeに処理を長く書きすぎないことです。Routeは「どのURLで何を呼ぶか」を読む場所として使うと、あとから見返しやすくなります。
Modelはデータの取得や保存を担当する
Modelは、データベースのテーブルと近い場所にいるものです。LaravelではEloquent Modelを使って、データの取得や保存を扱います。
投稿一覧なら、Controllerが直接SQLを書くのではなく、Post Modelを使って投稿を取得します。
$posts = Post::latest()->get();この1行だけ見るとControllerに書いてもよさそうですが、データに関する細かい条件が増えてきたら、Model側へ寄せることも考えます。最初から難しく分ける必要はありません。ただ、データの話はModelに近い、と覚えておくと整理しやすくなります。
Viewは表示を担当し、Controllerからデータを受け取る
Viewは画面を表示する場所です。Laravelでは多くの場合、Bladeファイルを resources/views 配下に置きます。
Controllerは、必要なデータをViewへ渡します。
return view('posts.index', ['posts' => $posts]);View側では、受け取った $posts を使ってHTMLを組み立てます。ここにデータベースから投稿を取得する処理まで書き始めると、表示とデータ取得が混ざります。
Viewは見た目を作る場所、ControllerはViewに渡すデータを用意する場所と考えると、最初は分かりやすいです。
Requestは入力値を受け取る入口になる
フォーム送信や検索キーワードを扱うときは、Requestが出てきます。Requestは、ブラウザから届いた入力やリクエスト情報を持っています。
たとえば検索キーワードを受け取るなら、Controllerのメソッドで次のように扱えます。
public function index(Request $request)
{
$keyword = $request->input('keyword');
}バリデーションの細かい話は別で学べば大丈夫です。まずは、入力値はRequestから来る、と押さえておきます。
小さな一覧表示で役割分担を見る
ここまでの役割を、投稿一覧の例でつなげてみます。
まずRouteで、URLとControllerをつなぎます。
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
Route::get('/posts', [PostController::class, 'index']);次にControllerです。
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\View\View;
class PostController extends Controller
{
public function index(): View
{
$posts = Post::latest()->get();
return view('posts.index', [
'posts' => $posts,
]);
}
}この例では、Controllerがやっていることは多くありません。
1. Post Modelから投稿を取得する 2. posts.index というViewを選ぶ 3. Viewへ $posts を渡す
そしてViewでは、受け取ったデータを表示します。
@foreach ($posts as $post)
<h2>{{ $post->title }}</h2>
@endforeachこれだけでも、Route、Controller、Model、Viewの流れが見えます。Routeが入口を決め、Controllerが流れを作り、Modelがデータを扱い、Viewが表示する。初心者のうちは、この流れを何度か小さく作るのが近道です。
Controllerに詰め込みすぎないための判断
Controllerは便利なので、気づくと長くなります。最初のうちは、多少長くなること自体は珍しくありません。問題は、何の処理が混ざっているのか分からなくなることです。
迷ったら、Controllerの中を次のように見ます。
- URLやHTTPメソッドの話をしているならRoute寄り
- データの取得や保存の話をしているならModel寄り
- HTMLや見た目の話をしているならView寄り
- 入力値の取得や確認の話をしているならRequest寄り
- それらをつなぐ流れならControllerの役割
ここで大事なのは、最初から完璧に分けようとしないことです。初心者の段階でService層やRepositoryを無理に作ると、かえって全体像が見えにくくなることがあります。
まずはControllerに書いた処理を見て、「これは本当にControllerが持つ話か」と立ち止まれるだけで十分です。長くなったら、表示、入力、データ取得、保存処理が混ざっていないかを見直します。
まとめ
LaravelでControllerを作る前に大事なのは、Controllerを何でも書く場所にしないことです。ControllerはRouteから呼ばれ、必要な処理をつなぎ、Viewやレスポンスを返す場所として考えると整理しやすくなります。
押さえておきたい役割は次の通りです。
- RouteはURLとControllerをつなぐ入口
- Controllerは処理の流れを組み立てる場所
- Modelはデータ取得や保存を担当する場所
- Viewは表示を担当する場所
- Requestは入力値を受け取る入口
まずは小さな一覧表示を作り、Route、Controller、Model、Viewの流れを確認してみるのがよいです。
役割分担が見えてくると、Controllerに何を書けばよいか、何を書きすぎない方がよいかも判断しやすくなります。
