簡體   English   中英

Symfony2服務的外觀模式

[英]Facade pattern for Symfony2 services

我是Symfony2的新手,正在構建一個使用外部API來獲取數據的應用程序。 我創建了很多客戶端類來檢索和轉換API中的每個實體,然后將這些類定義為服務-例如,我有一個FooClient具有諸如getAll()getThoseThatInterestMe($me) ,這些方法從API返回數據。

現在,我想創建一個ApiClientFacade類,該類充當Facade Pattern之后的所有XxxClient類的接口,例如,此Facade類將具有方法getAllFoo() ,該方法又將調用FooClient::getAll() ,依此類推...

我也可以將Facade類定義為服務,但是它具有太多的依賴關系-我大約有30個客戶端類。 另外,使用這種方法的afaik每次都會加載所有30個依賴項,而大多數時候我只需要一個依賴項...

那么,有沒有更好的方法可以做到這一點?

使用其他ApiClientFactory可以將有關“實例化ApiClient對象”的責任從您的ApiFacade類中轉移(據我所知,這是您的最初想法)。

在一些偽PHP代碼中,我的想法是:

$api = new ApiFacade(new ApiClientFactory);
$api->sendNotificationAboutUserLogin('username', time());

方法示例:

class ApiFacade {
  private $apiFactory;

  public function __construct(ApiClientFactory $factory)
  {
      $this->apiFactory = $factory;
  }    
  public function sendNotificationAboutUserLogin($username, $timeOfOperation)
    {
      return $this->apiFactory
          ->createApi('User')
          ->post(
              'notifications',
              array('operation' => 'login', 'username' => $username, 'timeOfOperation' => $timeOfOperation)
          );
    }
}

在這種情況下,您的Facade類保持可注入(可測試),但也變得更易於實例化(您不再需要將所有依賴項傳遞給它)。

ApiClientFactory應該看起來像這樣:

class ApiClientFactory {
    private $apiBaseUrl;
    public function __construct($apiBaseUrl)
    {
      $this->apiBaseUrl = $apiBaseUrl;
    }
    public function createApi($apiName)
    {
      switch ($apiName) {
        case 'User': return new \My\UserApi($this->apiBaseUrl);
        default: // throw an exception?
      }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM