2016-10-17 3 views
0

미래 webapp에서 differents API (Soap/Rest/Custom ...)에서 데이터를 가져와야하고 동시에 2, 3 또는 모든 API의 결과를 동시에 혼합해야합니다.symfony : 하나의 서비스에서 많은 서비스를로드합니까?

각각의 API를 들어

, 내가 SAMES 작업, 전 수행합니다 : $와

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

: 컨트롤러에서 getLastDatas, setOneData, putDatas2externalDB, 등등 ...

를, 내가 좋아하는 뭔가를 위해 할 수있는 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 app에서 이것을하는 적당한 방법은 무엇입니까?

+1

services.yml 파일의 인수 선언을 사용하여 "@myService"라는 주석이있는 다른 서비스에 서비스를 삽입 할 수 있다는 것을 알고 계십니까? – Mz1907

+1

이것은 올바른 디자인 패턴 질문보다는 심포니 질문이 아니며, 아마도 의견을 기반으로합니다. – Gerry

답변

0

어쩌면 API로 클래스를 만들 수 있습니다. 각 api 클래스를 서비스로 선언하십시오. 각

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

내가 별도의 서비스를 작성하는 제안 (하지만 공유 인터페이스를 구현) : 당신의 services.yml 파일

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

다음 Products.php 서비스 클래스를에서

API를 사용하고 이러한 개별 API 클라이언트를 집계하는 서비스를 작성하십시오. 귀하의 API 클라이언트를 태그에 의해

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

당신은 심지어이 구성을 약간 단순화 할 수 있습니다 : 같은 것을 볼 수 있었다 컨테이너에 통합 서비스를 등록

<?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를 가질 수 모든 태그 서비스를 가져 와서 집계 서비스에 등록하는 컴파일러 패스를 작성하십시오. 태그가 추가 된 서비스에 대한 자세한 내용은 http://symfony.com/doc/current/service_container/tags.html

+0

. 그것은 좋은 출발점 인 것 같다. 컴파일러 패스를 사용하여 특정 요청에 필요한 API 만로드 할 수 있기 때문이다. – Raphael1px

+0

아니요, 모든 요청이 아닌 컨테이너를 빌드 할 때 컴파일러 패스가 한 번 실행됩니다. 메서드 인수 또는 뭔가로 사용하려는 api를 전달할 수 있습니다. – Gerry

관련 문제