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