调用实现接口的所有类

时间:2016-08-07 07:11:41

标签: php symfony design-patterns

我有以下代码。

接口车辆,其方法为calculateDistance。

Class Car实现车辆 自行车类车辆 Class MotorCycle实现车辆

我接下来要做的是在我的控制器中调用每个实现Vehicle的类并从calculateDistance获取值的方法。

实现这一目标的最佳方式/设计模式是什么?

此时我只是调用所有实现接口Vehicle的类(通过ReflectionClass)并循环遍历它们以调用此方法。

1 个答案:

答案 0 :(得分:2)

最好的方法是实现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:

   ...

   $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)]);
    }

    ...

清除缓存后,您可以在操作中调用它们:

...

foreach ($this->get('my_registry')->all() as $myService) {
    $myService->doSomething();
}

...

其他一些东西,比如声明服务,给它们标记名称,注册你的编译器传递已写成here