勉強日記

チラ裏

Laravel輪読会 ch3 アプリケーションアーキテクチャ

www.socym.co.jp


3-1 MVCADR

3-1-1 MVC(Model View Controller)

@startuml
class Controller
class View
class Model
class Client

Client --> Controller
Controller --> Model
Controller <-- Model
Controller --> View
Client <-- View
@enduml

MVC

  • もともとのMVC
    • UI設計のための設計パターン
    • 【補】MVVMとかの仲間?
  • MVC2
    • もともとのMVCパターンをサーバサイドに適用したもの
  • 以下、単に「MVC」というときはMVC2を指す

MVCとLaravel

Laravelにおけるコントローラ

MVCにおけるCの責務 Laravelにおいて対応しているもの
HTTPリクエストの解釈(URI,HTTPメソッド) routes/*.php
制御を移すModel(ドメインロジック)の選択 コントローラのメソッド
表示するViewの選択 コントローラのメソッド

Laravelにおけるモデル

  • 「モデル」の本来の意味
    • ビジネスロジックを解決する処理グループ
    • 【補】ビジネスロジックはさらに細分化される (PoEAA的文脈)
      • アプリケーションロジック
        • システム関わるロジック
        • ワークフローロジックとも
        • 例: ATMでお金を送金するフロー
      • ドメインロジック
        • システム化しなくても存在するロジック
        • 例: 軽減税率
  • 小規模な場合はデータベース構造がそのままビジネス要求に結びつくこともある
    • が、本質は別物
  • いくつかの選択がある
  • 【補】PoEAAのパターンとの対応

f:id:wand_ta:20190801153126p:plain
PoEAAにおけるパターンとの対応

  • LaravelのEloquentはActive Record、もしくはRow Data Gatewayにあたる
    • DBのレコードを模したオブジェクトにsave()メソッドが生えている
    • ビジネスロジックを載せる場合は「Active Record」、DB操作のみ行うなら「Row Data Gateway
    • Eloquentにビジネスロジックを乗せない場合は「Row Data Gateway」にあたると自分は解釈しています
  • LaravelのDBファサードはTable Data Gatewayにあたる

トランザクションスクリプトパターン

ドメインモデルパターン

Laravelにおけるビュー

  • Illuminate\Http\Responseクラス

3-1-2 ADR(Action Domain Responder)

@startuml
class Action
class Responder
class Model
class Client

Client --> Action
Action --> Model
Action <-- Model
Action --> Responder
Client <-- Responder
@enduml

ADR

アクション(Action)

  • 単メソッドコントローラ

ドメイン(Domain)

  • MVCのModelに同じ

レスポンダ(Responder)

  • 責務: HTTP Responseの生成全般
  • Laravelでいうと、ViewやResponseインスタンスを生成するクラス
  • MVCのV(ページの見た目)よりも責任範囲が広い

3-2 アーキテクチャへの入口

3-2-1 フレームワークアーキテクチャ設計

  • ビジネスロジックとデータ永続化を分離しよう
    • データ永続化の実装はさまざま
      • Eloquent (RDB前提)
      • NoSQL
      • 【補】読むだけならconfigファイルも
      • etc.

3-2-2 アーキテクチャ設計のポイント

3-2-3 レイヤードアーキテクチャ

レイヤ化のための概念

  • SOLIDのS
    • 単一責任の原則
  • 【補】それぞれの責務
    • Controller
    • Service
    • RepositoryInterface
      • データ永続化の実装の隠蔽
    • Repository
      • データ永続化の実装
        • Eloquentとか

3-2-4 レイヤードアーキテクチャの一歩先の世界

  • 参考文献がいっぱい