L

コントローラ — 処理を整理する

ルートに直接処理を書く代わりに、コントローラに処理をまとめて見通しよく整理する方法を学びます。

広告枠(記事上)— 本番では AdSense 広告が表示されます

前の単元では、ルートに処理を直接書きました。しかしアプリが大きくなると、routes/web.php が処理だらけになり読みにくくなります。そこで処理を コントローラ に分離します。

コントローラを作る

make:controller コマンドでコントローラを作成します。

php artisan make:controller UserController

app/Http/Controllers/UserController.php が作られます。中身は空のクラスです。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    //
}

メソッドを定義する

コントローラに、処理を行う メソッド を追加します。

class UserController extends Controller
{
    public function index()
    {
        return 'ユーザー一覧です';
    }

    public function show(string $id)
    {
        return "ユーザーID: {$id}";
    }
}

ルートとコントローラを結びつける

routes/web.php で、ルートに「どのコントローラのどのメソッドを使うか」を指定します。

use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);
Route::get('/users/{id}', [UserController::class, 'show']);

/usersindex() が、/users/5show('5') が実行されます。ルートファイルがすっきりしました。

単一の処理だけのコントローラ

「1つの処理しかしない」コントローラは、__invoke メソッドを使うとより簡潔です。--invokable オプションで作成します。

php artisan make:controller WelcomeController --invokable
class WelcomeController extends Controller
{
    public function __invoke()
    {
        return 'ようこそ';
    }
}

ルート側はメソッド名の指定が不要になります。

Route::get('/welcome', WelcomeController::class);

まとめ

  • 処理はルートに直接書かず、コントローラ にまとめると見通しがよい。
  • php artisan make:controller 名前 でコントローラを作成する。
  • ルートは [Controller::class, 'メソッド名'] で結びつける。
  • 1処理だけなら --invokable__invoke)が簡潔。
  • 次の単元では、コントローラから ビュー(画面) を返します。
広告枠(記事下)— 本番では AdSense 広告が表示されます