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.7k
PHPでOfficeファイルを取り扱う! PHP Officeライブラリを プロダクトに組み込んだ話
hirobe1999
0
3k
PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与えた影響
hirobe1999
0
1.9k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
1.7k
新卒PHPer奮闘記 ~配属されたのは3歳違いのプロダクト!?~ / phperkaigi-2022-lt
hirobe1999
0
1.8k
Other Decks in Programming
See All in Programming
TipKitTips
ktcryomm
0
150
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
390
Python’s True Superpower
hynek
0
200
new(1.26) ← これすき / kamakura.go #8
utgwkk
0
1.6k
AIとペアプロして処理時間を97%削減した話 #pyconshizu
kashewnuts
1
200
Rubyと楽しいをつくる / Creating joy with Ruby
chobishiba
0
200
Fundamentals of Software Engineering In the Age of AI
therealdanvega
0
150
NOT A HOTEL - 建築や人と融合し、自由を創り出すソフトウェア
not_a_hokuts
2
560
JPUG勉強会 OSSデータベースの内部構造を理解しよう
oga5
2
230
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
130
米国のサイバーセキュリティタイムラインと見る Goの暗号パッケージの進化
tomtwinkle
2
420
Rails Girls Tokyo 18th GMO Pepabo Sponsor Talk
yutokyokutyo
0
200
Featured
See All Featured
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
470
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
74
Design in an AI World
tapps
0
160
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.2k
Code Reviewing Like a Champion
maltzj
528
40k
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
210
Technical Leadership for Architectural Decision Making
baasie
3
270
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
The Cost Of JavaScript in 2023
addyosmani
55
9.7k
Utilizing Notion as your number one productivity tool
mfonobong
4
240
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 千里の道も一歩から めでたしめでたし