我有以下代码。
接口车辆,其方法为calculateDistance。
Class Car实现车辆 自行车类车辆 Class MotorCycle实现车辆
我接下来要做的是在我的控制器中调用每个实现Vehicle的类并从calculateDistance获取值的方法。
实现这一目标的最佳方式/设计模式是什么?
此时我只是调用所有实现接口Vehicle的类(通过ReflectionClass)并循环遍历它们以调用此方法。
答案 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。