2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【PHPフレームワークFlow】パッケージを分けてモジュラーモノリスみたいにしてみる

Last updated at Posted at 2024-03-01

初めに

PHPフレームワークFlowは大規模エンタープライズ向けのWebフレームワークと公式ドキュメントに記載されています。大規模向けと聞くと、モノリシックなソースをイメージしますが、Flowはパッケージを分けることでモジュラーモノリスのような運用も可能なのかなと想像してます。
運用したことがないので想像ベースですが、今回はFlowでパッケージを分ける方法と、そのメリットについてまとめようと思います。

モジュラーモノリスとは

モジュラーモノリスとはソフトウェアのアーキテクチャの1つです。モノリシックとマイクロサービスの中間に位置し、マイクロサービスのようにランタイムが分かれているわけではないけど、責務や機能ごとにリポジトリ内でモジュールを分割して管理しやすくするというアーキテクチャになります。

以下の記事が分かりやすかったです。

Flowにおけるパッケージ

Flowでは、パッケージの種類が以下の3つに分けられます。

種類 説明
Application Controllerなど、ユーザが書くソースコードが格納されている
Framework Flowのフレームワークのソースが格納されている
Libraries Flow以外のライブラリが格納されている

以下のようなイメージです。
モジュラーモノリスのために追加するのは、Application配下のパッケージになります。

Project/
  └ Packages/
      ├ Application/
      |    ├ User.Package1/
      |    └ User.Package2/
      |
      ├ Framework/
      |    └ Neos.Flow/
      |
      └ Libraries/
           ├ doctrine/
           ├ phpstan/
           ├ .....
           └ and more

パッケージを分けてみる

パッケージを分割してみましょう。
といっても、コマンドを打って新規でパッケージを作るだけです。

初期状態はこんな感じです。

Project/
  └ Packages/
      ├ Application/
      |    └ Neos.Welcome/
      |
      ├ Framework/
      └ Libraries/

新規パッケージを作成

パッケージを作成するには、以下のコマンドを実行します。

$ ./flow package:create Added.Package
Created new package "Added.Package" at "C:/Path/to/project/Packages/Application/Added.Package/".

これだけでパッケージを追加することができます。

Project/
  └ Packages/
      ├ Application/
      |    ├ Neos.Welcome/
      |    └ Added.Package/(★追加された)
      |
      ├ Framework/
      └ Libraries/

追加されたパッケージにはClassesConfigrationなどのディレクトリと、composer.jsonが作成されています。
configurecomposer.jsonが作られてるということは、パッケージごとに異なる設定をすることができそうですね!

Added.Package/
  ├ Classes/
  ├ Configuration/(★)
  ├ Resources/
  ├ Tests/
  |   ├ Functional/
  |   └ Unit/
  |
  └ composer.json(★)

パッケージを分けるメリット

Flowでパッケージを分けるメリットを紹介します。

1. 設定ファイルを分けることができる

パッケージ配下にConfigrationディレクトリがあるため、設定ファイルを分けることが可能です。
Routes.yamlCaches.yamlなどをパッケージごとに定義することで、一つのファイルが肥大化することを防ぐことができます。

試したところ、Settings.yamlの一部の内容は、パッケージごとに定義することができなそうでした。例えば、DB接続情報などを複数持つことができません

2. Package.phpを分けることができる

Package.phpとは

Package.phpは、APIが呼び出されてからControllerにたどり着く前に呼び出されるクラスです。
デフォルトだとFlow標準のPackage.phpが呼び出されるのですが、こちらのPackageクラスを継承すればパッケージごとに作成することが可能になります。

Package.phpを分ける利点

Package.phpは、Controllerよりも前に呼び出されるということもあり、パッケージの全体的にかかわる処理を記載することが可能です。パッケージごとにルールを変えることができるのは嬉しいですね。

  • どのRequestHandlerを使うか
  • SignalとSlotを用いたイベントの定義
  • コンテキストごとに実施する処理

などなど

3. composer.jsonを別で用意できる

composer.jsonを分けることができるため、パッケージごとに異なるバージョンのライブラリを用いることが可能になります。既存のパッケージと新規作成するパッケージで、バージョンを分けることができるのは、使い勝手がよさそうですね。

終わりに

今回はFlowでパッケージを分けることでモジュラーモノリスのようなアーキテクチャを実装できるのではないかというテーマで書きました。想像ベースでしたが、Flowが大規模エンタープライズ向けと謳っている理由が少しわかった気がします。

全然関係ないですが、ずっと「モジューラモノリス」だと勘違いしてました。

以上です。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?