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
そのAPI、誰のため? Androidライブラリ設計における利用者目線の実践テクニック
mkeeda
2
2.8k
複雑なドメインに挑む.pdf
yukisakai1225
5
1.2k
GitHubとGitLabとAWS CodePipelineでCI/CDを組み比べてみた
satoshi256kbyte
4
250
テストカバレッジ100%を10年続けて得られた学びと品質
mottyzzz
2
610
Android端末で実現するオンデバイスLLM 2025
masayukisuda
1
170
AI時代のUIはどこへ行く?
yusukebe
18
9.1k
Processing Gem ベースの、2D レトロゲームエンジンの開発
tokujiros
2
130
機能追加とリーダー業務の類似性
rinchoku
2
1.3k
AI Agents: How Do They Work and How to Build Them @ Shift 2025
slobodan
0
100
Compose Multiplatform × AI で作る、次世代アプリ開発支援ツールの設計と実装
thagikura
0
170
Amazon RDS 向けに提供されている MCP Server と仕組みを調べてみた/jawsug-okayama-2025-aurora-mcp
takahashiikki
1
120
Reading Rails 1.0 Source Code
okuramasafumi
0
250
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
53
7.8k
RailsConf 2023
tenderlove
30
1.2k
The Cult of Friendly URLs
andyhume
79
6.6k
Navigating Team Friction
lara
189
15k
Practical Orchestrator
shlominoach
190
11k
Facilitating Awesome Meetings
lara
55
6.5k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
4 Signs Your Business is Dying
shpigford
184
22k
jQuery: Nuts, Bolts and Bling
dougneiner
64
7.9k
The Cost Of JavaScript in 2023
addyosmani
53
8.9k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
810
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.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 千里の道も一歩から めでたしめでたし