Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
Search
hirobe
March 24, 2023
Programming
0
2.1k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
PHPerKaigi2023 LT登壇資料です
hirobe
March 24, 2023
Tweet
Share
More Decks by hirobe
See All by hirobe
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
1.6k
PHPでOfficeファイルを取り扱う! PHP Officeライブラリを プロダクトに組み込んだ話
hirobe1999
0
2.8k
PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与えた影響
hirobe1999
0
1.8k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
1.7k
新卒PHPer奮闘記 ~配属されたのは3歳違いのプロダクト!?~ / phperkaigi-2022-lt
hirobe1999
0
1.7k
Other Decks in Programming
See All in Programming
Giselleで作るAI QAアシスタント 〜 Pull Requestレビューに継続的QAを
codenote
0
340
はじめてのカスタムエージェント【GitHub Copilot Agent Mode編】
satoshi256kbyte
0
160
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
220
gunshi
kazupon
1
140
ThorVG Viewer In VS Code
nors
0
660
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
4
680
AIエージェントの設計で注意するべきポイント6選
har1101
6
3k
AI時代を生き抜く 新卒エンジニアの生きる道
coconala_engineer
1
520
CSC307 Lecture 02
javiergs
PRO
1
760
Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)
uki00a
0
220
20251212 AI 時代的 Legacy Code 營救術 2025 WebConf
mouson
0
240
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
11
5.2k
Featured
See All Featured
Scaling GitHub
holman
464
140k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
0
220
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
0
1.8k
A designer walks into a library…
pauljervisheath
210
24k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
130
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
280
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
What the history of the web can teach us about the future of AI
inesmontani
PRO
0
390
Information Architects: The Missing Link in Design Systems
soysaucechin
0
740
New Earth Scene 8
popppiees
1
1.3k
First, design no harm
axbom
PRO
2
1.1k
Transcript
#phperkaigi ©2023 RAKUS Co., Ltd. フレームワークが存在しない時代 からのレガシープロダクトを、 Laravelに”載せる”実装戦略 廣部 知生
#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
#phperkaigi Laravel導入の経緯 4
#phperkaigi Mail Dealerの”負債” • グローバルスコープにロジックが存在する ◦ 〇〇.phpファイルに直接アクセス、ルーティングもない ◦ ビューロジックとビジネスロジックが混在している •
テンプレートエンジンは未使用 ◦ HTMLの出力は print や echo で行う • 当然クラスの概念も(ほぼ)存在しない 処理が上から下に流れるだけ 5
#phperkaigi 6
#phperkaigi Mail Dealerに、新UI導入要望 • 独自のUI、古い配色の解決 • バラバラのデザインパターンの統一 • デザインのコンポーネント化 etc…
現在の負債を抱えたままでは 実装・保守ともに苦しい…… 7
#phperkaigi 新UIを機にLaravelを導入しよう! 短期的目的 • Laravel導入で、新UIを素早くリリース 長期的目的 • オブジェクト指向を利用した一般的なアーキテクチャがほしい 8
#phperkaigi 🤔 9
#phperkaigi 目的を達成するための実装戦略 Laravelに”載せる” 10
#phperkaigi Laravelに”載せる”ための設計 • アーキテクチャにADRパターンを採用(長期的目的) ◦ Action:リクエストを受け取る ◦ Domain:必要な処理を行い結果を返す ◦ Responder:Domainの結果を受けレスポンスを返す
• 既存コードを、できる限り維持する(短期的目的) ◦ テストコードがないロジックはリファクタリングできない 11
#phperkaigi ビジネスロジックを Laravelに載せる!
#phperkaigi ビジネスロジックをLaravelに載せる 1. 処理のまとまりごとに、クラスメソッド化 ◦ PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利用することを許容する 2. 旧UIを利用して、動作確認 3.
処理ごとにAction(エンドポイント)を分ける ◦ 新UIからは、更新処理別にエンドポイントにアクセスする 13
#phperkaigi 14 旧UI 旧ロジッククラス メソッド化
#phperkaigi 15 旧UI メソッド化 置き換え
#phperkaigi ビジネスロジックをLaravelに載せる 1. 処理のまとまりごとに、クラスメソッド化 ◦ PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利用することを許容する 2. 旧UIを利用して、メソッド化の動作テスト 3.
処理ごとにAction(エンドポイント)を分ける ◦ 新UIからは、更新処理別にエンドポイントにアクセスする 16
#phperkaigi ビジネスロジックをLaravelに載せる 1. 処理のまとまりごとに、クラスメソッド化 ◦ PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利用することを許容する 2. 旧UIを利用して、動作確認 3.
処理ごとにAction(エンドポイント)を分ける ◦ 新UIからは、更新処理別にエンドポイントにアクセスする 17
#phperkaigi 18 /add-comment に リクエスト
#phperkaigi 19 コメント登録Domainが呼ばれる
#phperkaigi 20 旧UIと共通のメソッドが呼ばれる
#phperkaigi ビジネスロジックをLaravelに載せる 1. 処理のまとまりごとに、クラスメソッド化 a. PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利用することを許容する 2. 旧UIを利用して、動作確認 3.
処理ごとにAction(リクエスト)を分け、新UIからは処理ごとに 個別のエンドポイントを呼び出して更新処理等を行う 21 既存コードを 維持できる!
#phperkaigi ビューロジックを Laravelに載せる!
#phperkaigi ビュー処理をLaravelに載せる 23 1. 旧ロジックのHTML出力処理はすべてコメントアウト 2. 新UI・旧UIでも共通で使えるデータを、配列に格納する 例:ユーザネームやユーザIDなど 3. 共通データをまとめた配列をBladeに渡してレンダリング
#phperkaigi 24 前
#phperkaigi 25 後
#phperkaigi ビュー処理をLaravelに載せる 26 1. 旧ロジックのHTML出力処理はすべてコメントアウト 2. 新UI・旧UIでも共通で使えるデータを、配列に格納する 例:ユーザネームやユーザIDなど 3. 共通データをまとめた配列をBladeに渡してレンダリング
#phperkaigi 27 前
#phperkaigi 28 後
#phperkaigi ビュー処理をLaravelに載せる 29 1. 旧ロジックのHTML出力処理はすべてコメントアウト 2. 新UI・旧UIでも共通で使えるデータを、配列に格納する 例:ユーザネームやユーザIDなど 3. 共通データをまとめた配列をBladeに渡してレンダリング
#phperkaigi 30
#phperkaigi ビュー処理をLaravelに載せる 31 1. 旧ロジックのHTML出力処理はすべてコメントアウト 2. 新UIでも必要な実データのみ、配列に格納する 例:ユーザネームやユーザIDなど 3. 実データをまとめた配列を返り値にし、Bladeでレンダリング
既存コードを 維持できる!
#phperkaigi 効果 • 移植がスピーディに ◦ 新UIのためにコードを書き直す必要が(ほぼ)ない ◦ 旧UIの構造が(ほぼ)そのまま維持されているので、移植忘れも少なく ◦ 差分が見やすくコードレビューもしやすい
• テストが可能になった ◦ 旧:表示データがそのまま出力されており、テストが困難 ◦ 新:データが返り値として表現されるため、テストが容易に 32
#phperkaigi 33 無事載せられましたね めでたしめでたし……?
#phperkaigi 課題は山積み 34 行ったのはあくまで移植 →コードの状況が改善したわけではない すべての画面がLaravelに移行できたわけではない →開発に必要な学習や保守コストが増えた それでも、まずはLaravelに乗って テストが書きやすくなったことを喜ぶ
#phperkaigi 千里の道も一歩から めでたしめでたし