0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コントローラの責務とデータベース処理の分離

Last updated at Posted at 2025-05-15

はじめに

「コントローラとは?」という問いから、実際のコードをもとに、コントローラの役割とデータベース処理の分離について整理する。


コントローラとは何か?

結論から言えば、「リクエストに応じて実行する処理」のこと。
以下のコードで言えば、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から構築し、データアクセス層についての理解を深める。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?