2019/11/30 大改修!PHPレガシーコードビフォーアフターhttps://phperkaigi.connpass.com/event/155509/
独立したコアレイヤパターンの適用fortee編2019/11/30 PHPレガシーコードビフォーアフター@shin1x1
View Slide
@shin1x1新原(しんばら) 雅司1×1株式会社Webアプリケーション開発技術サポートPHPの現場 (Podcast)https://php-genba.shin1x1.com/2
Agenda独立したコアレイヤパターンforteeへの適用例まとめ3
独立したコアレイヤパターン4
独立したコアレイヤパターンアーキテクチャパターンの一つシステムを 2つのレイヤに分離コアレイヤアプリケーションレイヤ5
コアレイヤコアロジック(What)を実装IO等の技術詳細は実装しないコアレイヤのみに依存するようにするフレームワークには依存しないのが理想ただ局所的に依存する場合もあるユースケース、ドメインモデルなど6
インターフェイスコアレイヤが利用する技術詳細をインターフェイスで定義DBアクセスMail送信API呼び出しコアレイヤのコードはインターフェイスを介してIO等の技術詳細を実装7
アプリケーションレイヤ技術詳細(How)の実装コアレイヤで定義したインターフェイスを実装フレームワーク、ライブラリを活用UIからコアレイヤの実行(HTTP, CLIなど)8
9
10
11
ポートとアダプタ12
ポートとアダプタコアレイヤ:インターフェイス =ポートアプリケーションレイヤ:実装 =アダプタ13
ポートとアダプタアダプタを変えてもコアレイヤには影響しない14
Ports & Adaptershttp://www.dossier-andreas.net/software_architecture/ports_and_adapters.html 15
独立したコアレイヤパターンコアレイヤとアプリケーションレイヤに分離コアレイヤ:コアロジックアプリケーションレイヤ: UI、技術詳細コアレイヤ内での IO処理コアレイヤにインターフェイス定義(ポート)アプリケーションレイヤで実装(アダプタ)16
forteeへの適用17
fortee@tomzohさんが、2017/12から開発CakePHP 3で実装PHP 7.2(今回デモ用に 7.4)Webページと APIがエンドポイントによって混在18
パターン適用対象プロポーザルに Favを付ける、外す APIPOST /sample-conference/proposal/favuuid =プロポーザルを示す UUIDon = trueなら Favを付ける。それ以外なら外す。19
適用手順[core]コントローラのコードをユースケースに移行HTTP Request等で必要な値は引数で渡すHTTP Reponse等で必要な値は戻り値で返すIO関連の処理はインターフェイス(ポート)化[core]ユースケースのテスト[app]アダプタ実装[app]コントローラからユースケースを実行20
demo21
コードを役割でグループ分けコントローラメソッドに全てのコードがある役割によってグループ分けHTTP Request / ResponseIO (RDBMS)Business Logic22
レイヤに分けるHTTP Request / Response--->アプリケーションレイヤ(Controller)IO (RDBMS)--->コアレイヤ(ポート)--->アプリケーションレイヤ(アダプタ)Business Logic--->コアレイヤ(ユースケース)23
既存実装への適用アイデア漸進的に進めるロジックは同じでパターン適用テスト後にロジックをリファクタリングコアレイヤが完成したらコントローラから実行適用する箇所を絞る単純な読み込みだけなら適用しないビュー用の読み込みはコントローラに残す24
まとめコアレイヤは、どこから呼ばれても良いWeb, CLI, testコアレイヤは、IOの実装を知らなくて良いコアレイヤの適用箇所を少しづつ増やす0 or 100ではなく、除々に25
Q?@shin1x126