2016-10-17 54 views
0

在即將成爲web應用程序,我需要中檢索從型動物API(SOAP/REST /自定義...)上傳數據,有時從2,3,或在同一時間的所有API混合的結果。symfony:在一項服務中加載多項服務?

對於每個API,我將執行薩姆斯的行動,例如:getLastDatas,setOneData,putDatas2externalDB等..

在控制器,我喜歡的東西:

$someFreshResults = $this->get('app.products')->getFreshResults($para1, $para2, $arrayOfAPI); 

與$ arrayOfAPI列出1,2或全部API名稱。由於所有的API都不同(有時候不是微不足道的),我認爲可以通過API聲明服務,但是在app.products服務中注入所有這些服務非常糟糕和醜陋的想法,他們類似於:

public function getFreshResults($para1, $para2, $API) { 
    foreach($API as $oneApi) { 
     oneResult = $this->get($oneAPI)->getLastDatas($para1); 
     ... work with oneResult ... 
    } 
} 

在symfony應用程序中這樣做的正確方法是什麼?

+1

你知道你可以用參數聲明在services.yml文件注入服務到另一個與註釋「@myService」? – Mz1907

+1

這不是一個Symfony問題,而是一個適當的設計模式問題,因此也許是基於觀點的。 – Gerry

回答

0

也許你可以通過API創建一個類。並將每個API類聲明爲服務。

在你services.yml文件

services: 
    app.products: 
     class:  AppBundle\Products 
     arguments: ["@api1", "@api2", ...] 

,然後在Products.php服務類:

class Products 
{ 
    private $api1; 
    private $api2; 

    public function __construct($api1, $api2) //you must declare in the constructor the arguments declared in services.yml 
    { 
     $this->api1 = $api1; 
     $this->api2 = $api2; 
    } 
+0

這就是我在第一版中所做的。但是如果我有20或30個不同的API,但有時只需要真正撥打1或2呢? – Raphael1px

1

我建議編寫不同的服務(但實現共享接口),每個要使用的API,然後編寫一個聚合這些單個API客戶端的服務。您的聚合服務可以有一個這樣的API:

<?php 

class MyAggregrator 
{ 
    /** @var ApiClientInterface[] */ 
    private $clients = []; 

    public function registerClient(string $name, ApiClientInterface $client) 
    { 
     $this->clients[$name] = $client; 
    } 

    public function getProducts() 
    { 
     foreach ($this->clients as $name => $client) { 
      ... 
     } 
    } 
} 

註冊在容器中的聚合服務可以是這個樣子:通過標記您的API客戶

services: 
    my_aggregator: 
    class: MyAggregrator 
    calls: 
     - [registerClient, ["foo", "@api1"]] 
     - [registerClient, ["bar", "@api2"]] 

你甚至可以簡化這個配置有點,然後編寫一個編譯器過程來獲取每個標記的服務並將它們註冊到聚合服務中。有關標記服務的詳細信息,請參閱http://symfony.com/doc/current/service_container/tags.html

+0

謝謝。這似乎是一個好的開始,因爲我可能只需要一個編譯器通過加載一個特定的請求API。 – Raphael1px

+0

不,編譯器傳遞在構建容器時執行一次,而不是爲每個請求執行。你可以傳遞你想用作方法參數的api。 – Gerry