私は Symfony で非常に大規模なゲーム プロジェクトに取り組んでおり、同じ問題のバリエーションに遭遇し続けています。
1 つのクラスに含めるにはコードが多すぎるため、サービスを複数の「サブサービス」に分割する必要があります。たとえば、シリアライゼーションのメソッドごとに個別のハンドラー サービスを必要とするカスタム JSON シリアライザー ハンドラーです。
「サービスのファミリ」間で依存関係を渡すためのベスト プラクティスを見つけるのに苦労しています。将来的に問題が発生しないように、すべての定義を services.yml 内に保持することをお勧めしますが、それは達成できない可能性があると想定しています。
より良い例を次に示します。ユーザーからかなり長いアクション キューを取得する「ActionQueueService」があります。私がやりたいのは、各タイプのアクションを処理する個別のクラスを作成することです。
- ActionQueueService // アクション キュー JSON を処理し、サブサービスに委任します
- Abstractアクション
- PurchaseAction は AbstractAction を拡張します
- SellAction は AbstractAction を拡張します
- HarvestAction は AbstractAction を拡張します
これら 3 つの「アクション」がサービスとして定義されている場合は、独自の依存関係を持つことができます。ただし、それらはすべて ActionQueueService に注入する必要があります。それらが 38 個あるとどうなりますか (これは 1 日になります)。
私にとって次の当然のステップは、ActionFactory を作成することでした。ここで、ActionQueueService に 1 つの依存関係だけを渡しています。これを呼び出すだけで、任意のアクション サービスを呼び出すことができます。
$this->actionFactory->get('Harvest');
私が抱えている問題は、各子が独自の依存関係のリストを持っていることです。Purchase または Sell アクションには Character サービスと ShopStock サービスが必要であり、HarvestAction には HarvestService が必要です。Factory メソッドを使用することにしたので、ファクトリ クラス内でサブサービスをインスタンス化する必要があります。a) すべての依存関係をすべての子に注入するか、b) クレイジーな子コンストラクター ロジックを処理するためだけに、すべての依存関係を Factory に渡したくありません。
解決策の 1 つは、サービス コンテナーをファクトリに渡し、その場でサービスを作成できる命名規則を考え出すことです。しかし、これはかなり悪い習慣だと聞いたことがあります。おそらく、それで実行できる悪いことの量を制限するサービスコンテナーのラッパーです。
これを Symfony で解決する方法についてアイデアをお持ちの方がいらっしゃいましたら、よろしくお願いいたします。同様の回答がありますが、残念ながら私は PHP/Symfony 以外の言語を知りません。