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.2k
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
PHPerKaigi2023 LT登壇資料です
hirobe
March 24, 2023
Tweet
Share
More Decks by hirobe
See All by hirobe
PHPでOfficeファイルを取り扱う! PHP Officeライブラリを プロダクトに組み込んだ話
hirobe1999
0
1k
PHP8.1で、リソースがオブジェクトに!? マイナーリリースの変更が レガシープロダクトに与えた影響
hirobe1999
0
780
フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
hirobe1999
0
970
新卒PHPer奮闘記 ~配属されたのは3歳違いのプロダクト!?~ / phperkaigi-2022-lt
hirobe1999
0
1.2k
Other Decks in Programming
See All in Programming
Compose-View Interop in Practice (mDevCamp 2024)
stewemetal
0
170
dbtのドメイン分割による データ基盤の改善とDigdagとの連携
sakama
0
470
業務ツールとして使うPostman
msys75
0
110
Git Lint
bkuhlmann
4
760
Elm Form Validation
bkuhlmann
0
520
DMMプラットフォームがTiDB Cloudを採用した背景
pospome
9
4.3k
CDKコントリビュートの最初の壁を越えよう! -簡単issueの見つけ方-
badmintoncryer
3
240
Code Reviews
bkuhlmann
4
900
Micro Frontends for Java Microservices - Utah JUG 2024
mraible
PRO
1
110
Native Federation: The Future of Micro Frontends in Angular
manfredsteyer
PRO
0
120
Java 22 Overview
kishida
1
200
見た目から始める生産性向上
ikumatadokoro
10
1.5k
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
13
4.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
221
21k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
323
20k
Design by the Numbers
sachag
274
18k
Creatively Recalculating Your Daily Design Routine
revolveconf
211
11k
What’s in a name? Adding method to the madness
productmarketing
PRO
17
2.7k
Building Better People: How to give real-time feedback that sticks.
wjessup
356
18k
Adopting Sorbet at Scale
ufuk
69
8.6k
Visualization
eitanlees
137
14k
The MySQL Ecosystem @ GitHub 2015
samlambert
244
12k
Building Flexible Design Systems
yeseniaperezcruz
320
37k
Designing the Hi-DPI Web
ddemaree
276
33k
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 千里の道も一歩から めでたしめでたし