Php 调用实现接口的所有类

Php 调用实现接口的所有类,php,symfony,design-patterns,Php,Symfony,Design Patterns,我有以下代码 接口车辆,该车辆具有一个计算站的方法 汽车类工具车 自行车类工具车 摩托车类工具车 接下来我要做的是在我的控制器中调用每个实现Vehicle的类并从CalculateInstance获取值的方法 实现这一目标的最佳方式/设计模式是什么 此时,我正在调用所有实现接口工具的类(通过ReflectionClass)并循环调用此方法。最好的方法是实现CompilerPass。这是一个例子。 因此,创建一个注册表类(TransportChainclass,在该示例中),接口,以及实现该接口的

我有以下代码

接口车辆,该车辆具有一个计算站的方法

汽车类工具车 自行车类工具车 摩托车类工具车

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

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


此时,我正在调用所有实现接口工具的类(通过ReflectionClass)并循环调用此方法。

最好的方法是实现CompilerPass。这是一个例子。 因此,创建一个注册表类(
TransportChain
class,在该示例中),接口,以及实现该接口的所有类,将它们定义为服务,并为它们指定标记名。 之后,您可以在操作中调用该注册表服务,并通过每个服务调用所需的方法

基本示例:

接口

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;
    }
}
编译器类:

   ...

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

...

所有其他的东西,比如声明服务,给它们标签名,注册你的编译器通行证,都已经写好了。

最好的方法是实现CompilerPass。这是一个例子。 因此,创建一个注册表类(
TransportChain
class,在该示例中),接口,以及实现该接口的所有类,将它们定义为服务,并为它们指定标记名。 之后,您可以在操作中调用该注册表服务,并通过每个服务调用所需的方法

基本示例:

接口

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;
    }
}
编译器类:

   ...

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

...

所有其他的东西,比如声明服务,给它们标签名,注册你的编译器密码,都已经写好了。

问题是,使用designpatters,你可以“尝试”多种事情。这不是关于尝试,而是关于实现这一目标的最正确方式。我可以粘贴我“尝试过”的所有可能的东西,但这只会使问题变得混乱。你说“我有下面的代码”,但实际上没有显示代码。。。你只是描述一下而已。发布代码(最新的迭代)。还请描述您拒绝的变体,以及您拒绝这些变体的原因。这是现实问题还是家庭作业?这是一个非常奇怪的现实需求:“[…]我的控制器中的一个方法,它调用实现Vehicle的每个类,并从CalculateInstance获取值”。你为什么要这么做?ie:作为最终结果,你实际上需要实现什么?问题是,通过设计模式,你可以“尝试”多种事情。这不是关于尝试,而是关于实现这一目标的最正确方式。我可以粘贴我“尝试过”的所有可能的东西,但这只会使问题变得混乱。你说“我有下面的代码”,但实际上没有显示代码。。。你只是描述一下而已。发布代码(最新的迭代)。还请描述您拒绝的变体,以及您拒绝这些变体的原因。这是现实问题还是家庭作业?这是一个非常奇怪的现实需求:“[…]我的控制器中的一个方法,它调用实现Vehicle的每个类,并从CalculateInstance获取值”。你为什么要这么做?ie:作为最终结果,你实际上需要实现什么?