PHPerKaigi2023 LT登壇資料です
#phperkaigi©2023 RAKUS Co., Ltd.フレームワークが存在しない時代からのレガシープロダクトを、Laravelに”載せる”実装戦略廣部 知生
View Slide
#phperkaigi廣部 知生(@tomoki2135)21年大卒で株式会社ラクスに入社PHPでMail Dealerの開発を行っている最近読んでよかった本は「良いコード、悪いコードで学ぶ設計入門」2
#phperkaigiについてメール共有管理システム14年連続シェアNo.1(2009~2022)※2001年4月に販売開始Laravelは2011年リリースなので、10歳年上※出典:ITR「ITR Market View:メール/Webマーケティング市場2023」メール処理市場:ベンダー別売上金額推移およびシェア2009-2022年度(予測値)3
#phperkaigiLaravel導入の経緯4
#phperkaigiMail Dealerの”負債”● グローバルスコープにロジックが存在する○ 〇〇.phpファイルに直接アクセス、ルーティングもない○ ビューロジックとビジネスロジックが混在している● テンプレートエンジンは未使用○ HTMLの出力は print や echo で行う● 当然クラスの概念も(ほぼ)存在しない処理が上から下に流れるだけ5
#phperkaigi6
#phperkaigiMail Dealerに、新UI導入要望● 独自のUI、古い配色の解決● バラバラのデザインパターンの統一● デザインのコンポーネント化 etc…現在の負債を抱えたままでは実装・保守ともに苦しい……7
#phperkaigi新UIを機にLaravelを導入しよう!短期的目的● Laravel導入で、新UIを素早くリリース長期的目的● オブジェクト指向を利用した一般的なアーキテクチャがほしい8
#phperkaigi🤔9
#phperkaigi目的を達成するための実装戦略Laravelに”載せる”10
#phperkaigiLaravelに”載せる”ための設計● アーキテクチャにADRパターンを採用(長期的目的)○ Action:リクエストを受け取る○ Domain:必要な処理を行い結果を返す○ Responder:Domainの結果を受けレスポンスを返す● 既存コードを、できる限り維持する(短期的目的)○ テストコードがないロジックはリファクタリングできない11
#phperkaigiビジネスロジックをLaravelに載せる!
#phperkaigiビジネスロジックをLaravelに載せる1. 処理のまとまりごとに、クラスメソッド化○ PhpStormの機能を使って、機械的にメソッド化参照渡しやグローバル変数を利用することを許容する2. 旧UIを利用して、動作確認3. 処理ごとにAction(エンドポイント)を分ける○ 新UIからは、更新処理別にエンドポイントにアクセスする13
#phperkaigi14旧UI旧ロジッククラスメソッド化
#phperkaigi15旧UIメソッド化置き換え
#phperkaigiビジネスロジックをLaravelに載せる1. 処理のまとまりごとに、クラスメソッド化○ PhpStormの機能を使って、機械的にメソッド化参照渡しやグローバル変数を利用することを許容する2. 旧UIを利用して、メソッド化の動作テスト3. 処理ごとにAction(エンドポイント)を分ける○ 新UIからは、更新処理別にエンドポイントにアクセスする16
#phperkaigiビジネスロジックをLaravelに載せる1. 処理のまとまりごとに、クラスメソッド化○ PhpStormの機能を使って、機械的にメソッド化参照渡しやグローバル変数を利用することを許容する2. 旧UIを利用して、動作確認3. 処理ごとにAction(エンドポイント)を分ける○ 新UIからは、更新処理別にエンドポイントにアクセスする17
#phperkaigi18/add-comment にリクエスト
#phperkaigi19コメント登録Domainが呼ばれる
#phperkaigi20旧UIと共通のメソッドが呼ばれる
#phperkaigiビジネスロジックをLaravelに載せる1. 処理のまとまりごとに、クラスメソッド化a. PhpStormの機能を使って、機械的にメソッド化参照渡しやグローバル変数を利用することを許容する2. 旧UIを利用して、動作確認3. 処理ごとにAction(リクエスト)を分け、新UIからは処理ごとに個別のエンドポイントを呼び出して更新処理等を行う21既存コードを維持できる!
#phperkaigiビューロジックをLaravelに載せる!
#phperkaigiビュー処理をLaravelに載せる231. 旧ロジックのHTML出力処理はすべてコメントアウト2. 新UI・旧UIでも共通で使えるデータを、配列に格納する 例:ユーザネームやユーザIDなど3. 共通データをまとめた配列をBladeに渡してレンダリング
#phperkaigi24前
#phperkaigi25後
#phperkaigiビュー処理をLaravelに載せる261. 旧ロジックのHTML出力処理はすべてコメントアウト2. 新UI・旧UIでも共通で使えるデータを、配列に格納する 例:ユーザネームやユーザIDなど3. 共通データをまとめた配列をBladeに渡してレンダリング
#phperkaigi27前
#phperkaigi28後
#phperkaigiビュー処理をLaravelに載せる291. 旧ロジックのHTML出力処理はすべてコメントアウト2. 新UI・旧UIでも共通で使えるデータを、配列に格納する 例:ユーザネームやユーザIDなど3. 共通データをまとめた配列をBladeに渡してレンダリング
#phperkaigi30
#phperkaigiビュー処理をLaravelに載せる311. 旧ロジックのHTML出力処理はすべてコメントアウト2. 新UIでも必要な実データのみ、配列に格納する 例:ユーザネームやユーザIDなど3. 実データをまとめた配列を返り値にし、Bladeでレンダリング既存コードを維持できる!
#phperkaigi効果● 移植がスピーディに○ 新UIのためにコードを書き直す必要が(ほぼ)ない○ 旧UIの構造が(ほぼ)そのまま維持されているので、移植忘れも少なく○ 差分が見やすくコードレビューもしやすい● テストが可能になった○ 旧:表示データがそのまま出力されており、テストが困難○ 新:データが返り値として表現されるため、テストが容易に32
#phperkaigi33無事載せられましたねめでたしめでたし……?
#phperkaigi課題は山積み34行ったのはあくまで移植→コードの状況が改善したわけではないすべての画面がLaravelに移行できたわけではない→開発に必要な学習や保守コストが増えたそれでも、まずはLaravelに乗ってテストが書きやすくなったことを喜ぶ
#phperkaigi千里の道も一歩からめでたしめでたし