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 千里の道も一歩から めでたしめでたし