フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略
by
hirobe
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
#phperkaigi ©2023 RAKUS Co., Ltd. フレームワークが存在しない時代 からのレガシープロダクトを、 Laravelに”載せる”実装戦略 廣部 知生
Slide 2
Slide 2 text
#phperkaigi 廣部 知生(@tomoki2135) 21年大卒で株式会社ラクスに入社 PHPでMail Dealerの開発を行っている 最近読んでよかった本は 「良いコード、悪いコードで学ぶ設計入門」 2
Slide 3
Slide 3 text
#phperkaigi について メール共有管理システム 14年連続シェアNo.1(2009~2022)※ 2001年4月に販売開始 Laravelは2011年リリースなので、10歳年上 ※出典:ITR「ITR Market View:メール/Webマーケティング市場2023」メール処理市場:ベンダー別売上金額推移およびシェア2009-2022年度(予測値) 3
Slide 4
Slide 4 text
#phperkaigi Laravel導入の経緯 4
Slide 5
Slide 5 text
#phperkaigi Mail Dealerの”負債” ● グローバルスコープにロジックが存在する ○ 〇〇.phpファイルに直接アクセス、ルーティングもない ○ ビューロジックとビジネスロジックが混在している ● テンプレートエンジンは未使用 ○ HTMLの出力は print や echo で行う ● 当然クラスの概念も(ほぼ)存在しない 処理が上から下に流れるだけ 5
Slide 6
Slide 6 text
#phperkaigi 6
Slide 7
Slide 7 text
#phperkaigi Mail Dealerに、新UI導入要望 ● 独自のUI、古い配色の解決 ● バラバラのデザインパターンの統一 ● デザインのコンポーネント化 etc… 現在の負債を抱えたままでは 実装・保守ともに苦しい…… 7
Slide 8
Slide 8 text
#phperkaigi 新UIを機にLaravelを導入しよう! 短期的目的 ● Laravel導入で、新UIを素早くリリース 長期的目的 ● オブジェクト指向を利用した一般的なアーキテクチャがほしい 8
Slide 9
Slide 9 text
#phperkaigi 🤔 9
Slide 10
Slide 10 text
#phperkaigi 目的を達成するための実装戦略 Laravelに”載せる” 10
Slide 11
Slide 11 text
#phperkaigi Laravelに”載せる”ための設計 ● アーキテクチャにADRパターンを採用(長期的目的) ○ Action:リクエストを受け取る ○ Domain:必要な処理を行い結果を返す ○ Responder:Domainの結果を受けレスポンスを返す ● 既存コードを、できる限り維持する(短期的目的) ○ テストコードがないロジックはリファクタリングできない 11
Slide 12
Slide 12 text
#phperkaigi ビジネスロジックを Laravelに載せる!
Slide 13
Slide 13 text
#phperkaigi ビジネスロジックをLaravelに載せる 1. 処理のまとまりごとに、クラスメソッド化 ○ PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利用することを許容する 2. 旧UIを利用して、動作確認 3. 処理ごとにAction(エンドポイント)を分ける ○ 新UIからは、更新処理別にエンドポイントにアクセスする 13
Slide 14
Slide 14 text
#phperkaigi 14 旧UI 旧ロジッククラス メソッド化
Slide 15
Slide 15 text
#phperkaigi 15 旧UI メソッド化 置き換え
Slide 16
Slide 16 text
#phperkaigi ビジネスロジックをLaravelに載せる 1. 処理のまとまりごとに、クラスメソッド化 ○ PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利用することを許容する 2. 旧UIを利用して、メソッド化の動作テスト 3. 処理ごとにAction(エンドポイント)を分ける ○ 新UIからは、更新処理別にエンドポイントにアクセスする 16
Slide 17
Slide 17 text
#phperkaigi ビジネスロジックをLaravelに載せる 1. 処理のまとまりごとに、クラスメソッド化 ○ PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利用することを許容する 2. 旧UIを利用して、動作確認 3. 処理ごとにAction(エンドポイント)を分ける ○ 新UIからは、更新処理別にエンドポイントにアクセスする 17
Slide 18
Slide 18 text
#phperkaigi 18 /add-comment に リクエスト
Slide 19
Slide 19 text
#phperkaigi 19 コメント登録Domainが呼ばれる
Slide 20
Slide 20 text
#phperkaigi 20 旧UIと共通のメソッドが呼ばれる
Slide 21
Slide 21 text
#phperkaigi ビジネスロジックをLaravelに載せる 1. 処理のまとまりごとに、クラスメソッド化 a. PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利用することを許容する 2. 旧UIを利用して、動作確認 3. 処理ごとにAction(リクエスト)を分け、新UIからは処理ごとに 個別のエンドポイントを呼び出して更新処理等を行う 21 既存コードを 維持できる!
Slide 22
Slide 22 text
#phperkaigi ビューロジックを Laravelに載せる!
Slide 23
Slide 23 text
#phperkaigi ビュー処理をLaravelに載せる 23 1. 旧ロジックのHTML出力処理はすべてコメントアウト 2. 新UI・旧UIでも共通で使えるデータを、配列に格納する 例:ユーザネームやユーザIDなど 3. 共通データをまとめた配列をBladeに渡してレンダリング
Slide 24
Slide 24 text
#phperkaigi 24 前
Slide 25
Slide 25 text
#phperkaigi 25 後
Slide 26
Slide 26 text
#phperkaigi ビュー処理をLaravelに載せる 26 1. 旧ロジックのHTML出力処理はすべてコメントアウト 2. 新UI・旧UIでも共通で使えるデータを、配列に格納する 例:ユーザネームやユーザIDなど 3. 共通データをまとめた配列をBladeに渡してレンダリング
Slide 27
Slide 27 text
#phperkaigi 27 前
Slide 28
Slide 28 text
#phperkaigi 28 後
Slide 29
Slide 29 text
#phperkaigi ビュー処理をLaravelに載せる 29 1. 旧ロジックのHTML出力処理はすべてコメントアウト 2. 新UI・旧UIでも共通で使えるデータを、配列に格納する 例:ユーザネームやユーザIDなど 3. 共通データをまとめた配列をBladeに渡してレンダリング
Slide 30
Slide 30 text
#phperkaigi 30
Slide 31
Slide 31 text
#phperkaigi ビュー処理をLaravelに載せる 31 1. 旧ロジックのHTML出力処理はすべてコメントアウト 2. 新UIでも必要な実データのみ、配列に格納する 例:ユーザネームやユーザIDなど 3. 実データをまとめた配列を返り値にし、Bladeでレンダリング 既存コードを 維持できる!
Slide 32
Slide 32 text
#phperkaigi 効果 ● 移植がスピーディに ○ 新UIのためにコードを書き直す必要が(ほぼ)ない ○ 旧UIの構造が(ほぼ)そのまま維持されているので、移植忘れも少なく ○ 差分が見やすくコードレビューもしやすい ● テストが可能になった ○ 旧:表示データがそのまま出力されており、テストが困難 ○ 新:データが返り値として表現されるため、テストが容易に 32
Slide 33
Slide 33 text
#phperkaigi 33 無事載せられましたね めでたしめでたし……?
Slide 34
Slide 34 text
#phperkaigi 課題は山積み 34 行ったのはあくまで移植 →コードの状況が改善したわけではない すべての画面がLaravelに移行できたわけではない →開発に必要な学習や保守コストが増えた それでも、まずはLaravelに乗って テストが書きやすくなったことを喜ぶ
Slide 35
Slide 35 text
#phperkaigi 千里の道も一歩から めでたしめでたし