初めに
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/
追加されたパッケージにはClasses
やConfigration
などのディレクトリと、composer.json
が作成されています。
configure
とcomposer.json
が作られてるということは、パッケージごとに異なる設定をすることができそうですね!
Added.Package/
├ Classes/
├ Configuration/(★)
├ Resources/
├ Tests/
| ├ Functional/
| └ Unit/
|
└ composer.json(★)
パッケージを分けるメリット
Flowでパッケージを分けるメリットを紹介します。
1. 設定ファイルを分けることができる
パッケージ配下にConfigration
ディレクトリがあるため、設定ファイルを分けることが可能です。
Routes.yaml
やCaches.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が大規模エンタープライズ向けと謳っている理由が少しわかった気がします。
全然関係ないですが、ずっと「モジューラモノリス」だと勘違いしてました。
以上です。