2016-08-07 36 views
-1

私は以下のコードを用意しています。インターフェイスを実装するすべてのクラスを呼び出す

メソッドcalculateDistanceメソッドを持つインタフェースビークル。

クラスの車は、車両 クラス自転車は車両 クラスのオートバイが、私は次のやりたいことは車を実装し、calculateDistanceから値を取得するすべてのクラスを呼び出して、私のコントローラのメソッドである自動車

を実装して実装して実装しています。

これを達成するための最良の方法/設計パターンは何でしょうか?

現時点では、(ReflectionClassを介して)Vehicleインタフェースを実装するすべてのクラスを呼び出し、ループしてこのメ​​ソッドを呼び出すだけです。

+0

これは、designpattersでは複数のことを試すことができるということです。これは試行ではなく、これを達成する最も正しい方法は何かについてです。 私は試した可能性のあるものをすべて貼り付けることができますが、これは質問を乱雑にするだけです。 – SnIpY

+2

あなたは「私は次のコードを持っている」と言っていますが、実際にはコードを表示していません。ちょっと説明するだけです。コード(最新の反復)を投稿してください。また、あなたが却下したバリエーションとその理由を説明してください。これは実際の問題ですか、それとも宿題ですか?これは現実世界の非常に奇妙な要件です: "[...]コントローラ内のメソッドで、Vehicleを実装し、calculateDistanceから値を取得するすべてのクラスを呼び出します。なぜあなたはこれをする必要がありますか?すなわち、最終的な結果として達成するためには*実際には*何が必要ですか? –

答えて

0

最も良い方法は、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と書かれています。

関連する問題