最も良い方法は、CompilerPassを実装することです。ここにはexampleがあります。 したがって、レジストリクラス(この例ではTransportChain
クラス)、インターフェイス、およびそのインターフェイスを実装するすべてのクラスを作成し、それらをサービスとして定義し、タグ名を付けます。 その後、そのレジストリサービスをあなたのアクションで呼び出すことができ、各サービスが望むメソッドを呼び出すことができます。
基本例:
インタフェース
interface SomeInterface {
public function doSomething();
}
サービス1:
class First implement SomeInterface {
public function doSomething() {
// do smth
}
}
サービス2:
class Second implement SomeInterface {
public function doSomething() {
// do smth
}
}
レジストリクラス:
class MyRegistry
{
private $services = [];
public function addMyService($service)
{
$this->services[] = $service;
}
public function all()
{
return $this->services;
}
}
CompilerPass:、
...
foreach ($this->get('my_registry')->all() as $myService) {
$myService->doSomething();
}
...
宣言するサービスのような全体の他のものを、彼らにタグ名を与え、登録:
...
$myServices = $container->findTaggedServiceIds('my_tag');
if (empty($myServices)) {
return;
}
$registry = $container->getDefinition('my_registry');
foreach ($myServices as $key => $myService) {
$registry->addMethodCall('add', [new Reference($key)]);
}
...
キャッシュをclearignした後、あなたのアクションでそれらを呼び出すことができますあなたのコンパイラパスはhereと書かれています。
これは、designpattersでは複数のことを試すことができるということです。これは試行ではなく、これを達成する最も正しい方法は何かについてです。 私は試した可能性のあるものをすべて貼り付けることができますが、これは質問を乱雑にするだけです。 – SnIpY
あなたは「私は次のコードを持っている」と言っていますが、実際にはコードを表示していません。ちょっと説明するだけです。コード(最新の反復)を投稿してください。また、あなたが却下したバリエーションとその理由を説明してください。これは実際の問題ですか、それとも宿題ですか?これは現実世界の非常に奇妙な要件です: "[...]コントローラ内のメソッドで、Vehicleを実装し、calculateDistanceから値を取得するすべてのクラスを呼び出します。なぜあなたはこれをする必要がありますか?すなわち、最終的な結果として達成するためには*実際には*何が必要ですか? –