Upgrade to Pro — share decks privately, control downloads, hide ads and more …

フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略

hirobe
March 24, 2023

フレームワークが存在しない時代からのレガシープロダクトを、 Laravelに”載せる”実装戦略

PHPerKaigi2023 LT登壇資料です

hirobe

March 24, 2023
Tweet

More Decks by hirobe

Other Decks in Programming

Transcript

  1. #phperkaigi
    ©2023 RAKUS Co., Ltd.
    フレームワークが存在しない時代
    からのレガシープロダクトを、
    Laravelに”載せる”実装戦略
    廣部 知生

    View full-size slide

  2. #phperkaigi
    廣部 知生(@tomoki2135)
    21年大卒で株式会社ラクスに入社
    PHPでMail Dealerの開発を行っている
    最近読んでよかった本は
    「良いコード、悪いコードで学ぶ設計入門」
    2

    View full-size slide

  3. #phperkaigi
    について
    メール共有管理システム
    14年連続シェアNo.1(2009~2022)※
    2001年4月に販売開始
    Laravelは2011年リリースなので、10歳年上
    ※出典:ITR「ITR Market View:メール/Webマーケティング市場2023」メール処理市場:ベンダー別売上金額推移およびシェア2009-2022年度(予測値)
    3

    View full-size slide

  4. #phperkaigi
    Laravel導入の経緯
    4

    View full-size slide

  5. #phperkaigi
    Mail Dealerの”負債”
    ● グローバルスコープにロジックが存在する
    ○ 〇〇.phpファイルに直接アクセス、ルーティングもない
    ○ ビューロジックとビジネスロジックが混在している
    ● テンプレートエンジンは未使用
    ○ HTMLの出力は print や echo で行う
    ● 当然クラスの概念も(ほぼ)存在しない
    処理が上から下に流れるだけ
    5

    View full-size slide

  6. #phperkaigi
    󰤇
    6

    View full-size slide

  7. #phperkaigi
    Mail Dealerに、新UI導入要望
    ● 独自のUI、古い配色の解決
    ● バラバラのデザインパターンの統一
    ● デザインのコンポーネント化 etc…
    現在の負債を抱えたままでは
    実装・保守ともに苦しい……
    7

    View full-size slide

  8. #phperkaigi
    新UIを機にLaravelを導入しよう!
    短期的目的
    ● Laravel導入で、新UIを素早くリリース
    長期的目的
    ● オブジェクト指向を利用した一般的なアーキテクチャがほしい
    8

    View full-size slide

  9. #phperkaigi
    🤔
    9

    View full-size slide

  10. #phperkaigi
    目的を達成するための実装戦略
    Laravelに”載せる”
    10

    View full-size slide

  11. #phperkaigi
    Laravelに”載せる”ための設計
    ● アーキテクチャにADRパターンを採用(長期的目的)
    ○ Action:リクエストを受け取る
    ○ Domain:必要な処理を行い結果を返す
    ○ Responder:Domainの結果を受けレスポンスを返す
    ● 既存コードを、できる限り維持する(短期的目的)
    ○ テストコードがないロジックはリファクタリングできない
    11

    View full-size slide

  12. #phperkaigi
    ビジネスロジックを
    Laravelに載せる!

    View full-size slide

  13. #phperkaigi
    ビジネスロジックをLaravelに載せる
    1. 処理のまとまりごとに、クラスメソッド化
    ○ PhpStormの機能を使って、機械的にメソッド化
    参照渡しやグローバル変数を利用することを許容する
    2. 旧UIを利用して、動作確認
    3. 処理ごとにAction(エンドポイント)を分ける
    ○ 新UIからは、更新処理別にエンドポイントにアクセスする
    13

    View full-size slide

  14. #phperkaigi
    14
    旧UI
    旧ロジッククラス
    メソッド化

    View full-size slide

  15. #phperkaigi
    15
    旧UI
    メソッド化
    置き換え

    View full-size slide

  16. #phperkaigi
    ビジネスロジックをLaravelに載せる
    1. 処理のまとまりごとに、クラスメソッド化
    ○ PhpStormの機能を使って、機械的にメソッド化
    参照渡しやグローバル変数を利用することを許容する
    2. 旧UIを利用して、メソッド化の動作テスト
    3. 処理ごとにAction(エンドポイント)を分ける
    ○ 新UIからは、更新処理別にエンドポイントにアクセスする
    16

    View full-size slide

  17. #phperkaigi
    ビジネスロジックをLaravelに載せる
    1. 処理のまとまりごとに、クラスメソッド化
    ○ PhpStormの機能を使って、機械的にメソッド化
    参照渡しやグローバル変数を利用することを許容する
    2. 旧UIを利用して、動作確認
    3. 処理ごとにAction(エンドポイント)を分ける
    ○ 新UIからは、更新処理別にエンドポイントにアクセスする
    17

    View full-size slide

  18. #phperkaigi
    18
    /add-comment に
    リクエスト

    View full-size slide

  19. #phperkaigi
    19
    コメント登録Domainが呼ばれる

    View full-size slide

  20. #phperkaigi
    20
    旧UIと共通のメソッドが呼ばれる

    View full-size slide

  21. #phperkaigi
    ビジネスロジックをLaravelに載せる
    1. 処理のまとまりごとに、クラスメソッド化
    a. PhpStormの機能を使って、機械的にメソッド化
    参照渡しやグローバル変数を利用することを許容する
    2. 旧UIを利用して、動作確認
    3. 処理ごとにAction(リクエスト)を分け、新UIからは処理ごとに
    個別のエンドポイントを呼び出して更新処理等を行う
    21
    既存コードを
    維持できる!

    View full-size slide

  22. #phperkaigi
    ビューロジックを
    Laravelに載せる!

    View full-size slide

  23. #phperkaigi
    ビュー処理をLaravelに載せる
    23
    1. 旧ロジックのHTML出力処理はすべてコメントアウト
    2. 新UI・旧UIでも共通で使えるデータを、配列に格納する
     例:ユーザネームやユーザIDなど
    3. 共通データをまとめた配列をBladeに渡してレンダリング

    View full-size slide

  24. #phperkaigi
    24

    View full-size slide

  25. #phperkaigi
    25

    View full-size slide

  26. #phperkaigi
    ビュー処理をLaravelに載せる
    26
    1. 旧ロジックのHTML出力処理はすべてコメントアウト
    2. 新UI・旧UIでも共通で使えるデータを、配列に格納する
     例:ユーザネームやユーザIDなど
    3. 共通データをまとめた配列をBladeに渡してレンダリング

    View full-size slide

  27. #phperkaigi
    27

    View full-size slide

  28. #phperkaigi
    28

    View full-size slide

  29. #phperkaigi
    ビュー処理をLaravelに載せる
    29
    1. 旧ロジックのHTML出力処理はすべてコメントアウト
    2. 新UI・旧UIでも共通で使えるデータを、配列に格納する
     例:ユーザネームやユーザIDなど
    3. 共通データをまとめた配列をBladeに渡してレンダリング

    View full-size slide

  30. #phperkaigi
    30

    View full-size slide

  31. #phperkaigi
    ビュー処理をLaravelに載せる
    31
    1. 旧ロジックのHTML出力処理はすべてコメントアウト
    2. 新UIでも必要な実データのみ、配列に格納する
     例:ユーザネームやユーザIDなど
    3. 実データをまとめた配列を返り値にし、Bladeでレンダリング
    既存コードを
    維持できる!

    View full-size slide

  32. #phperkaigi
    効果
    ● 移植がスピーディに
    ○ 新UIのためにコードを書き直す必要が(ほぼ)ない
    ○ 旧UIの構造が(ほぼ)そのまま維持されているので、移植忘れも少なく
    ○ 差分が見やすくコードレビューもしやすい
    ● テストが可能になった
    ○ 旧:表示データがそのまま出力されており、テストが困難
    ○ 新:データが返り値として表現されるため、テストが容易に
    32

    View full-size slide

  33. #phperkaigi
    33
    無事載せられましたね
    めでたしめでたし……?

    View full-size slide

  34. #phperkaigi
    課題は山積み
    34
    行ったのはあくまで移植
    →コードの状況が改善したわけではない
    すべての画面がLaravelに移行できたわけではない
    →開発に必要な学習や保守コストが増えた
    それでも、まずはLaravelに乗って
    テストが書きやすくなったことを喜ぶ

    View full-size slide

  35. #phperkaigi
    千里の道も一歩から
    めでたしめでたし

    View full-size slide