[英]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.