実務に効くノウハウを発信中

【初心者向け】LaravelでControllerを作る前に知りたい役割分担

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 にアクセスされたら PostControllerindex メソッドを呼ぶ、という対応を書きます。

PHP
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を使って投稿を取得します。

PHP
$posts = Post::latest()->get();

この1行だけ見るとControllerに書いてもよさそうですが、データに関する細かい条件が増えてきたら、Model側へ寄せることも考えます。最初から難しく分ける必要はありません。ただ、データの話はModelに近い、と覚えておくと整理しやすくなります。

Viewは表示を担当し、Controllerからデータを受け取る

Viewは画面を表示する場所です。Laravelでは多くの場合、Bladeファイルを resources/views 配下に置きます。

Controllerは、必要なデータをViewへ渡します。

PHP
return view('posts.index', ['posts' => $posts]);

View側では、受け取った $posts を使ってHTMLを組み立てます。ここにデータベースから投稿を取得する処理まで書き始めると、表示とデータ取得が混ざります。

Viewは見た目を作る場所、ControllerはViewに渡すデータを用意する場所と考えると、最初は分かりやすいです。

Requestは入力値を受け取る入口になる

フォーム送信や検索キーワードを扱うときは、Requestが出てきます。Requestは、ブラウザから届いた入力やリクエスト情報を持っています。

たとえば検索キーワードを受け取るなら、Controllerのメソッドで次のように扱えます。

PHP
public function index(Request $request)
{
    $keyword = $request->input('keyword');
}

バリデーションの細かい話は別で学べば大丈夫です。まずは、入力値はRequestから来る、と押さえておきます。

小さな一覧表示で役割分担を見る

ここまでの役割を、投稿一覧の例でつなげてみます。

まずRouteで、URLとControllerをつなぎます。

PHP
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;

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

次にControllerです。

PHP
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では、受け取ったデータを表示します。

PHP
@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に何を書けばよいか、何を書きすぎない方がよいかも判断しやすくなります。

よかったらシェアしてね!
  • URLをコピーしました!
目次