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
1.9k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
PHPerKaigi2023 LT登壇資料です
hirobe
March 24, 2023
Tweet
Share
More Decks by hirobe
See All by hirobe
20年もののレガシープロダクトに 0からPHPStanを入れるまで / phpcon2024
hirobe1999
0
1.4k
PHPでOfficeファイルを取り扱う! PHP Officeライブラリを プロダクトに組み込んだ話
hirobe1999
0
2.5k
PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与えた影響
hirobe1999
0
1.6k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
1.6k
新卒PHPer奮闘記 ~配属されたのは3歳違いのプロダクト!?~ / phperkaigi-2022-lt
hirobe1999
0
1.6k
Other Decks in Programming
See All in Programming
階層構造を表現するデータ構造とリファクタリング 〜1年で10倍成長したプロダクトの変化と課題〜
yuhisatoxxx
3
930
非同期jobをtransaction内で 呼ぶなよ!絶対に呼ぶなよ!
alstrocrack
0
560
CSC305 Lecture 04
javiergs
PRO
0
260
ててべんす独演会〜Flowの全てを語ります〜
tbsten
1
220
Advance Your Career with Open Source
ivargrimstad
0
380
SpecKitでどこまでできる? コストはどれくらい?
leveragestech
0
590
高度なUI/UXこそHotwireで作ろう Kaigi on Rails 2025
naofumi
4
3.6k
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
350
猫と暮らすネットワークカメラ生活🐈 ~Vision frameworkでペットを愛でよう~ / iOSDC Japan 2025
yutailang0119
0
220
Pythonスレッドとは結局何なのか? CPython実装から見るNoGIL時代の変化
curekoshimizu
5
1.5k
Catch Up: Go Style Guide Update
andpad
0
200
CSC305 Lecture 06
javiergs
PRO
0
210
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
45
2.5k
Site-Speed That Sticks
csswizardry
11
880
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.7k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
For a Future-Friendly Web
brad_frost
180
9.9k
Building Applications with DynamoDB
mza
96
6.6k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
2.6k
Side Projects
sachag
455
43k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.5k
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 千里の道も一歩から めでたしめでたし