Model、Repository、Controller、Serviceって何?
目次
Model(モデル)
modelはデータの型を定義します。
【Bookのモデル情報】
・タイトル:title
・著者:author
・価格:price
・タイトル:title
・著者:author
・価格:price
【userのモデル情報】
・名前:name
・メアド:email
・名前:name
・メアド:email
こんな感じです。DBのテーブルを作るときに似ていますね。
このmodelと実際のDBを紐づけます。
そうする事で、このmodelを『インスタンス化』した物にデータを挿入したりすると、実際のDBにもデータが挿入されるという感じです。
modelを使う事で、いちいちSQL文を書かなくてもDB操作ができるので便利です。
※ここでの「Bookのモデル情報」「Userのモデル情報」でファイルを分けた方が良いと思います。
【ファイル構成】
model
├ Book.[拡張子]
└ User.[拡張子]
model
├ Book.[拡張子]
└ User.[拡張子]
Repository(レポジトリ)
Modelを『インスタンス化』した物に対して、データを操作する処理を作成します。
【Bookに対する操作】
・本の情報を読み取る処理
・新しい本のデータを追加する処理
・本の価格を更新する処理
・売らなくなった本のデータを削除する処理
・本の情報を読み取る処理
・新しい本のデータを追加する処理
・本の価格を更新する処理
・売らなくなった本のデータを削除する処理
という感じです。
これもModelと同様にファイルを分けましょう。
【ファイル構成】
repository
├ BookRepository.[拡張子]
└ UserRepository.[拡張子]
repository
├ BookRepository.[拡張子]
└ UserRepository.[拡張子]
Controller(コントローラー)
ユーザーの命令を受け取る部分です。
他にも、Serviceから「○○の処理が完了した」という事を受け取り、ユーザーに完了を知らせたりもします。
【ユーザーが購入ボタンを押した】
■ 購入ボタンが押された
↓
■ ControllerがServiceに対して「○○番ユーザーが○○の本を購入」という情報を渡す
↓
■ Serviceが色々処理をする。
↓
■ Serviceから「購入処理が終わった」という指示がControllerに届く
↓
■ Controllerがユーザー画面に「購入完了」のメッセージを出す
■ 購入ボタンが押された
↓
■ ControllerがServiceに対して「○○番ユーザーが○○の本を購入」という情報を渡す
↓
■ Serviceが色々処理をする。
↓
■ Serviceから「購入処理が終わった」という指示がControllerに届く
↓
■ Controllerがユーザー画面に「購入完了」のメッセージを出す
この様な流れです。Serviceに関しては後ほど解説をします。
ControllerもModel同様、ファイルを分けて下さい。
【ファイル構成】
controller
├ BookController.[拡張子]
└ UserController.[拡張子]
controller
├ BookController.[拡張子]
└ UserController.[拡張子]
Service(サービス)
Serviceは一番メインの処理を書く所で「実際に何をするのか」という部分を担当します。
【Serviceの処理】
■ Controllerから「○○番ユーザーが○○の本を購入」という情報がServiceに届く
↓
■ Repositoryの「検索処理」を利用してDBに○○番のユーザーが存在するか調べる
■ Repositoryの「検索機能」を利用してDBに○○の本があるか調べる
■ 外部から読み込んだクレジット関連の機能を利用して、ユーザーが購入可能か調べる
↓
■ 購入可能なら、外部から読み込んだクレジット関連機能に購入処理を実行させる
↓
■ Repositoryの「登録機能」で購入情報をDBに登録する
↓
■ Controllerに「購入処理が終わった」と指示をする
■ Controllerから「○○番ユーザーが○○の本を購入」という情報がServiceに届く
↓
■ Repositoryの「検索処理」を利用してDBに○○番のユーザーが存在するか調べる
■ Repositoryの「検索機能」を利用してDBに○○の本があるか調べる
■ 外部から読み込んだクレジット関連の機能を利用して、ユーザーが購入可能か調べる
↓
■ 購入可能なら、外部から読み込んだクレジット関連機能に購入処理を実行させる
↓
■ Repositoryの「登録機能」で購入情報をDBに登録する
↓
■ Controllerに「購入処理が終わった」と指示をする
イメージできたでしょうか?
RepositoryやServiceに既に用意してある処理を利用して、Controllerが実際の処理を行う。
という感じです。
この「実際の処理」を「ビジネスロジック」と言ったりもします。
ServiceもModel同様ファイルを分けましょう。
【ファイル構成】
service
├ BookService.[拡張子]
└ UserService.[拡張子]
service
├ BookService.[拡張子]
└ UserService.[拡張子]