はじめに
「コントローラとは?」という問いから、実際のコードをもとに、コントローラの役割とデータベース処理の分離について整理する。
コントローラとは何か?
結論から言えば、「リクエストに応じて実行する処理」のこと。
以下のコードで言えば、app/Routing/routes.php
に定義された匿名関数がそれにあたる。
'path_1' => function (): HTMLRenderer {
return new HTMLRenderer('view_1');
}
この匿名関数が、特定のリクエスト(例: /path_1
)に対して、どのようなレスポンスを返すかを定義している。
つまり、「何をするか」を決める処理=コントローラ。
コードに潜む問題点
次のように、ルート定義の中で直接SQLを扱う場合の問題点について考える。
'api/images/upload' => function (): JSONRenderer {
$db = new MySQLWrapper();
$stmt = $db->prepare("INSERT INTO images (image_name, unique_string) VALUES (?, ?)");
$stmt->bind_param("ss", $imageName, $uniqueString);
$stmt->execute();
$stmt->close();
$db->close();
return new JSONRenderer([
'uniqueString' => $uniqueString,
]);
}
このようにコントローラ内にデータベース処理が書かれている場合、データベースの種類や構造が変わったときに、すべてのコントローラを修正する必要がある。
この状態は、「密結合」と呼ばれ、保守性・再利用性が低くなる要因となる。
解決策:ヘルパー関数による責務の分離
データベースとのやり取りは、コントローラの外に切り出して、データアクセス層に委譲すべき。
メリット
- コントローラは「何をしたいか」だけを書ける
- データベースの種類が変わっても、データアクセス層 の中だけを修正すればよい
- テストがしやすくなる(モックによる差し替えが可能)
まとめ
- コントローラとは「リクエストに対して実行する処理」を定義する場所
- コントローラ内でデータベースを直接操作するのは密結合につながる
- データアクセス処理はヘルパー関数や Repository に分離すべき
- これにより、保守性・拡張性・テスト性の高い設計になる
おわりに
明日以降はDAOのコードを0から構築し、データアクセス層についての理解を深める。