フレームワークが存在しない時代からのレガシープロダクトを、 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
© RAKUS Co., Ltd. ノンフレームワークのレガシープロダクトを、 Laravelに"載せる"実装戦略と、その後の世界。 #PHPConference2023 廣部知⽣ 2023/10/08 1
Slide 2
Slide 2 text
2 話すこと ● ⾃⼰紹介 ● Laravel導⼊の経緯 ● Laravelに”載せる”実装戦略 ● Laravelに”載せる”⼿法の紹介 ● ”載せた”後の世界
Slide 3
Slide 3 text
© RAKUS Co., Ltd. 3 ⾃⼰紹介 #PHPConference2023
Slide 4
Slide 4 text
4 廣部知⽣(@tomoki2135) ● 21卒で株式会社ラクスに⼊社 ● PHPでMail Dealerの開発を⾏っている ● 彦根市⺠なのにアイコンは名古屋城 ● 最近はスト6で戦いの螺旋を 登り続けています
Slide 5
Slide 5 text
5 Mail Dealerについて メール共有管理システム 14年連続シェアNo.1(2009〜2022)※ 歴史は更に⻑く、2001年4⽉に販売開始 Laravelは2011年リリースなので、10歳年上 ※出典:ITR「ITR Market View:メール∕Webマーケティング市場2023」 メール処理市場:ベンダー別売上⾦額推移およびシェア2009-2022年度(予測値)
Slide 6
Slide 6 text
© RAKUS Co., Ltd. 6 Q.なぜそんなプロダクトにLaravelを? 🤔 #PHPConference2023
Slide 7
Slide 7 text
© RAKUS Co., Ltd. 7 Laravel導⼊の経緯 #PHPConference2023
Slide 8
Slide 8 text
8 Mail Dealerの”負債” ● ルーティングが存在せず、〇〇.phpに直接アクセス ● ロジックは〇〇.phpのグローバル領域に直書き ○ クラスの概念も(ほぼ)存在しない 処理が上から下に流れるだけ ● テンプレートエンジンは未使⽤ ○ HTMLの出⼒は print や echo で⾏われている ● 当然、⼗分な⾃動テストも存在しない(特にUI周り)
Slide 9
Slide 9 text
9 Mail Dealerの”負債” ● ルーティングが存在せず 〇〇.phpに直接アクセス maildealer ├ lib └ public ├ img ├ css └ php ├ index.php ├ login.php ├ maillist.php ……
Slide 10
Slide 10 text
10 Mail Dealerの”負債” ● ロジックは〇〇.phpの グローバル領域に直書き ● クラスの概念も(ほぼ) 存在しない ● テンプレートエンジンは 未使⽤ <*ページ特有のスクリプトが記述されている EOF; echo << サンプルページ {$js} EOF;
Slide 11
Slide 11 text
© RAKUS Co., Ltd. 11 #PHPConference2023
Slide 12
Slide 12 text
12 新UI導⼊要望 ‧現⾏のUIはデザインが古臭くて 印象があまり良くなくて…… ‧モダンな今⾵のUIにしたいです! ‧旧UI(現⾏UI)の機能はすべて 新UIにも実装してください! ‧顧客インパクト⼤きいから 旧UIもしばらく残したいです
Slide 13
Slide 13 text
© RAKUS Co., Ltd. 13 #PHPConference2023
Slide 14
Slide 14 text
© RAKUS Co., Ltd. 14 現在の負債を抱えたままでは 実装‧保守ともに厳しい…… #PHPConference2023
Slide 15
Slide 15 text
15 Laravelの導⼊により、⼀挙両得を狙う ● ⻑期的⽬的 ○ オブジェクト指向の考えに則った⼀般的な アーキテクチャに変更し、保守性を向上させる ● 短期的⽬的 ○ 旧UIの機能を維持しながら新UIを素早くリリース
Slide 16
Slide 16 text
© RAKUS Co., Ltd. 16 🤔 #PHPConference2023
Slide 17
Slide 17 text
© RAKUS Co., Ltd. 17 ⽬的を達成するための実装戦略 Laravelに”載せる” #PHPConference2023
Slide 18
Slide 18 text
18 Laravelの導⼊により、⼀挙両得を狙う ● ⻑期的⽬的 ○ オブジェクト指向を考えに則った⼀般的な アーキテクチャに変更 ● 短期的⽬的 ○ 旧UIの機能を維持しながら新UIを素早くリリース
Slide 19
Slide 19 text
19 Laravelに”載せる”ための設計 ● アーキテクチャにADRパターンを採⽤(⻑期的⽬的) ○ 短期的⽬的達成のために都合が良かった(後述) ○ 少なくとも、体系⽴ったアーキテクチャを採⽤するだけで 保守性が向上する
Slide 20
Slide 20 text
20 Laravelの導⼊により、⼀挙両得を狙う ● ⻑期的⽬的 ○ オブジェクト指向を考えに則った⼀般的な アーキテクチャに変更 ● 短期的⽬的 ○ 旧UIの機能を維持しながら新UIを素早くリリース
Slide 21
Slide 21 text
21 Laravelに”載せる”ための設計 ● 既存コードを、できる限り維持する(短期的⽬的) ○ 既存コードをそのまま移植することができれば 理論上機能は同じ ○ リファクタリングは⾏わない テストがないため、”既存機能と同じ”を担保できない →不具合までも移植する ○ あくまで”Laravel上で動くこと”を⽬標とする
Slide 22
Slide 22 text
22 Laravelに”載せる”ための課題 ● 最⼤の課題は、ビューロジックとビジネスロジックが ⼀体化していること ● もはや、ビューとロジックを 分 離 するのは ⼀ 般 的 Laravelも分離が前提のフレームワーク ● ビューとロジックを分離しないと フレームワークに載せられない ビューとロジックを分離するしか無い!
Slide 23
Slide 23 text
23 実装⽅針 Action Responder Domain HTTP request HTTP response ビジネスロジック 呼び出し ここにビューを移植 ここにロジックを移植 Blade Vue
Slide 24
Slide 24 text
© RAKUS Co., Ltd. 24 ビジネスロジックを Laravelに”載せる” #PHPConference2023
Slide 25
Slide 25 text
25 実装⽅針 Action Responder Domain HTTP request HTTP response ビジネスロジック 呼び出し ここにビューを移植 ここにロジックを移植 Blade Vue
Slide 26
Slide 26 text
26 ビジネスロジックをLaravelに”載せる” 1. 処理のまとまりごとに、クラスメソッド化 a. PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数の利⽤は許容する 2. 旧UIを利⽤して、動作確認 3. 処理ごとにActionを分割し、新UIからは 個別のエンドポイントを呼び出して処理を⾏う
Slide 27
Slide 27 text
27 旧UI
Slide 28
Slide 28 text
28 旧UI 旧ロジッククラス メソッド化
Slide 29
Slide 29 text
29 旧UI メソッド化 置き換え
Slide 30
Slide 30 text
30 旧UI メソッド化 置き換え
Slide 31
Slide 31 text
31 旧UI メソッド化 置き換え
Slide 32
Slide 32 text
32 ビジネスロジックをLaravelに”載せる” 1. 処理のまとまりごとに、クラスメソッド化 a. PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利⽤することを許容する 2. 旧UIを利⽤して、動作確認 3. 処理ごとにActionを分割し、新UIからは 個別のエンドポイントを呼び出して処理を⾏う
Slide 33
Slide 33 text
33 ビジネスロジックをLaravelに”載せる” 1. 処理のまとまりごとに、クラスメソッド化 a. PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利⽤することを許容する 2. 旧UIを利⽤して、動作確認 3. 処理ごとにActionを分割し、新UIからは 個別のエンドポイントを呼び出して処理を⾏う
Slide 34
Slide 34 text
34 /add-comment に リクエスト
Slide 35
Slide 35 text
35 コメント登録Domainが呼ばれる
Slide 36
Slide 36 text
36 旧UIと共通のメソッドが呼ばれる
Slide 37
Slide 37 text
37 ビジネスロジックをLaravelに”載せる” 1. 処理のまとまりごとに、クラスメソッド化 a. PhpStormの機能を使って、機械的にメソッド化 参照渡しやグローバル変数を利⽤することを許容する 2. 旧UIを利⽤して、動作確認 3. 処理ごとにActionを分割し、新UIからは 個別のエンドポイントを呼び出して処理を⾏う 既存コードを 維持できる!
Slide 38
Slide 38 text
© RAKUS Co., Ltd. 38 ビューロジックを Laravelに”載せる” #PHPConference2023
Slide 39
Slide 39 text
39 実装⽅針 Action Responder Domain HTTP request HTTP response ビジネスロジック 呼び出し ここにビューを移植 ここにロジックを移植 Blade Vue
Slide 40
Slide 40 text
40 ビューロジックをLaravelに”載せる” 1. 旧ロジックのHTML出⼒処理はすべてコメントアウト 2. 新UIでも必要な実データのみ、配列に格納する 例:ユーザネームやユーザIDなど 3. 実データをまとめた配列を返り値にし、Bladeでレンダリング
Slide 41
Slide 41 text
41 旧 旧ロジックのHTML出⼒処理はすべてコメントアウト
Slide 42
Slide 42 text
42 新 旧ロジックのHTML出⼒処理はすべてコメントアウト
Slide 43
Slide 43 text
43 ビューロジックをLaravelに”載せる” 1. 旧ロジックのHTML出⼒処理はすべてコメントアウト 2. 新UIでも必要な実データのみ、配列に格納する 例:ユーザネームやユーザIDなど 3. 実データをまとめた配列を返り値にし、Bladeでレンダリング
Slide 44
Slide 44 text
44 旧 新UIでも必要な実データのみ、配列に格納する
Slide 45
Slide 45 text
45 新 新UIでも必要な実データのみ、配列に格納する
Slide 46
Slide 46 text
46 ビューロジックをLaravelに”載せる” 1. 旧ロジックのHTML出⼒処理はすべてコメントアウト 2. 新UIでも必要な実データのみ、配列に格納する 例:ユーザネームやユーザIDなど 3. 実データをまとめた配列を返り値にし、Bladeでレンダリング
Slide 47
Slide 47 text
47 実データをまとめた配列を返り値に
Slide 48
Slide 48 text
48 Bladeでレンダリング
Slide 49
Slide 49 text
49 ビューロジックをLaravelに”載せる” 1. 旧ロジックのHTML出⼒処理はすべてコメントアウト 2. 新UIでも必要な実データのみ、配列に格納する 例:ユーザネームやユーザIDなど 3. 実データをまとめた配列を返り値にし、Bladeでレンダリング 既存コードを 維持できる!
Slide 50
Slide 50 text
50 効果 ● 移植がスピーディになった ○ 新UIのためにコードを書き直す必要が(ほぼ)ない ○ 旧UIの構造が(ほぼ)そのまま維持されているので 移植忘れも少なくできた ● ⾃動テストが可能になった ○ 旧:表⽰データがそのまま出⼒されており、テストが困難 ○ 新:データが返り値として表現されるため、テストが容易
Slide 51
Slide 51 text
51 Laravelの導⼊により、⼀挙両得を狙う ● ⻑期的⽬的 ○ オブジェクト指向を利⽤した⼀般的な アーキテクチャに変更 ● 短期的⽬的 ○ 旧UIの機能を維持しながら新UIを素早くリリース 達 成 達 成
Slide 52
Slide 52 text
© RAKUS Co., Ltd. 52 プロジェクト⼤成功! めでたしめでたし……? #PHPConference2023
Slide 53
Slide 53 text
© RAKUS Co., Ltd. 53 ソフトウェア開発は、終わらない #PHPConference2023
Slide 54
Slide 54 text
© RAKUS Co., Ltd. 54 ”載せた”後の世界 #PHPConference2023
Slide 55
Slide 55 text
55 Good ● ビューとビジネスロジックの分割によって フロントエンドとバックエンドが分業ができるようになった ● ロジックをベタ書きする必要がなくなり オブジェクト指向化が進んだ ● 新機能はテストが⾃動テストが容易になった
Slide 56
Slide 56 text
© RAKUS Co., Ltd. 56 光があれば、闇もある #PHPConference2023
Slide 57
Slide 57 text
57 Bad ● ⾏ったのは、あくまで移植 →コードの改善が⾏われたわけではないので レガシーな書き⽅や、グローバル変数が多く残る ● 全ての画⾯が移植されたわけではないし、旧UIの保守もいる →開発に必要な学習や保守コストが増えた
Slide 58
Slide 58 text
58 今後の展望 ● テストが書けるようになったので、テストを作成して リファクタリングを進めていく ● 今後の新機能は基本新UIのみ、旧UIはクローズ予定 ノンフレームワークがLaravelに載ったことが⼤きな⼀歩 今後はオブジェクト指向に寄せていく
Slide 59
Slide 59 text
© RAKUS Co., Ltd. 59 千⾥の道も⼀歩から めでたしめでたし #PHPConference2023