Model、Repository、Controller、Serviceって何?

オフ 投稿者: sesera

目次

Model(モデル)

modelはデータの型を定義します。

【Bookのモデル情報】
・タイトル:title
・著者:author
・価格:price
【userのモデル情報】
・名前:name
・メアド:email

こんな感じです。DBのテーブルを作るときに似ていますね。

このmodelと実際のDBを紐づけます。

そうする事で、このmodelを『インスタンス化』した物にデータを挿入したりすると、実際のDBにもデータが挿入されるという感じです。

modelを使う事で、いちいちSQL文を書かなくてもDB操作ができるので便利です。

※ここでの「Bookのモデル情報」「Userのモデル情報」でファイルを分けた方が良いと思います。

【ファイル構成】
model
├ Book.[拡張子]
└ User.[拡張子]

Repository(レポジトリ)

Modelを『インスタンス化』した物に対して、データを操作する処理を作成します。

【Bookに対する操作】
・本の情報を読み取る処理
・新しい本のデータを追加する処理
・本の価格を更新する処理
・売らなくなった本のデータを削除する処理

という感じです。

これもModelと同様にファイルを分けましょう。

【ファイル構成】
repository
├ BookRepository.[拡張子]
└ UserRepository.[拡張子]

Controller(コントローラー)

ユーザーの命令を受け取る部分です。

他にも、Serviceから「○○の処理が完了した」という事を受け取り、ユーザーに完了を知らせたりもします。

【ユーザーが購入ボタンを押した】
■ 購入ボタンが押された

ControllerServiceに対して「○○番ユーザーが○○の本を購入」という情報を渡す

Serviceが色々処理をする。

Serviceから「購入処理が終わった」という指示がControllerに届く

Controllerがユーザー画面に「購入完了」のメッセージを出す

この様な流れです。Serviceに関しては後ほど解説をします。

ControllerもModel同様、ファイルを分けて下さい。

【ファイル構成】
controller
├ BookController.[拡張子]
└ UserController.[拡張子]

Service(サービス)

Serviceは一番メインの処理を書く所で「実際に何をするのか」という部分を担当します。

【Serviceの処理】
Controllerから「○○番ユーザーが○○の本を購入」という情報がServiceに届く

Repositoryの「検索処理」を利用してDBに○○番のユーザーが存在するか調べる
Repositoryの「検索機能」を利用してDBに○○の本があるか調べる
■ 外部から読み込んだクレジット関連の機能を利用して、ユーザーが購入可能か調べる

■ 購入可能なら、外部から読み込んだクレジット関連機能に購入処理を実行させる

Repositoryの「登録機能」で購入情報をDBに登録する

Controllerに「購入処理が終わった」と指示をする

イメージできたでしょうか?

RepositoryServiceに既に用意してある処理を利用して、Controllerが実際の処理を行う。

という感じです。

この「実際の処理」を「ビジネスロジック」と言ったりもします。

ServiceもModel同様ファイルを分けましょう。

【ファイル構成】
service
├ BookService.[拡張子]
└ UserService.[拡張子]