-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獲取值」。你爲什麼需要這樣做?即:你作爲最終結果需要達到什麼目標? –