Laravelのコントローラは単一の大きなファイルになるべきではありません。
責任を明確に分割するために、適切にクラスを作り、機能を分けることが推奨されます。
手順 1: ファイル分割の目的を確認
- 責任ごとに分割: 単一責任の原則に従い、異なる機能を異なるコントローラクラス
に分けます。 - ルートごとの整理: 各ルートに対応するコントローラを分け、整理します。
手順 2: 新しいコントローラを作成
Laravelでは、artisanコマンドを使って簡単にコントローラを作成できます。
例えば、既存のController.phpで処理を分けたい場合:
bashphp artisan make:controller UserController
php artisan make:controller ProductController
これにより、app/Http/Controllersディレクトリ内にUserController.phpとProductController.phpが作成されます。
手順 3: メソッドを移動する
次に、元のController.phpの該当メソッドを新しいコントローラに移動します。
例: 元のController.phpに以下のようなメソッドがあるとします:
phpclass Controller extends BaseController
{
public function showUser($id)
{
// ユーザーを取得する処理
}
public function showProduct($id)
{
// 商品を取得する処理
}
}
これを分割します。
UserController.php
phpnamespace App\Http\Controllers;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function showUser($id)
{
// ユーザーを取得する処理
}
}
ProductController.php
phpnamespace App\Http\Controllers;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function showProduct($id)
{
// 商品を取得する処理
}
}
手順 4: ルートファイルを更新
分割したコントローラに対応するルートを適切に設定します。
routes/web.php
phpuse App\Http\Controllers\UserController;
use App\Http\Controllers\ProductController;
Route::get('/user/{id}', [UserController::class, 'showUser']);
Route::get('/product/{id}', [ProductController::class, 'showProduct']);
手順 5: テスト
変更後、ブラウザやAPIクライアントを使って新しいルートが正しく動作しているか
確認します。
ヒント
- コントローラのネスト整理: 複雑なアプリケーションでは、コントローラを
AdminやAPIなどのサブディレクトリに整理することができます。- 例:
php artisan make:controller Admin/UserControllerでapp/Http/Controllers/Admin/UserController.phpを作成。
- 例:
- リソースコントローラ: 多くのアクションを含むコントローラには
--resourceオプションを使用して、標準のアクションセットを持つ
コントローラを作成します。
bashphp artisan make:controller UserController --resource
これによりファイル分割とルート管理が効率化され、保守性が向上します!
クラスの継承やexportなどを使う事もできますが、とりあえずはControllerクラスを
増やして対応という方が見通しはよいようです。


