-1
我有以下代码。调用实现接口的所有类
接口车辆有一个方法calculateDistance。
级轿车实现了车辆 类自行车实现车辆 类电单车实现车辆
我想接下来做的就是在我的控制器的方法调用每一个实现车辆和calculateDistance获取值类。
什么是最好的方式/设计模式来实现这一目标?
此时我只是调用实现接口Vehicle(通过ReflectionClass)的所有类并遍历它们以调用此方法。
我有以下代码。调用实现接口的所有类
接口车辆有一个方法calculateDistance。
级轿车实现了车辆 类自行车实现车辆 类电单车实现车辆
我想接下来做的就是在我的控制器的方法调用每一个实现车辆和calculateDistance获取值类。
什么是最好的方式/设计模式来实现这一目标?
此时我只是调用实现接口Vehicle(通过ReflectionClass)的所有类并遍历它们以调用此方法。
最好的方法是实现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
}
}
Registry类:
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)]);
}
...
clearign缓存后,你可以打电话给他们在你的行动:
...
foreach ($this->get('my_registry')->all() as $myService) {
$myService->doSomething();
}
...
整个其他的东西,比如宣称的服务,给他们的标签名,注册你的编译器pass已经写成here。
事情是,与designpatters你可以'尝试'多种事情。这不是关于尝试,而是关于什么才是实现这一目标的最正确方法。 我可以粘贴所有可能的东西,我'尝试',但这只是混乱的问题。 – SnIpY
你说“我有以下代码”,但是实际上并没有显示代码......你只是有点描述它。发布代码(最新的迭代)。还要描述你解雇的变化,以及你为什么解雇他们。这是一个现实世界的问题还是作业?这是一个非常奇怪的现实世界需求:“[...]我的控制器中的一个方法,调用每个实现Vehicle的类并从calculateDistance获取值”。你为什么需要这样做?即:你作为最终结果需要达到什么目标? –