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