首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony2服务的外观模式

Symfony2服务的外观模式
EN

Stack Overflow用户
提问于 2015-03-29 21:28:55
回答 1查看 2.9K关注 0票数 4

对于Symfony2,我正在构建一个应用程序,它使用外部API获取数据。我创建了许多客户机类来检索和转换API中的每个实体,并且我将这些类定义为服务--例如,我有一个FooClient,其方法为getAll()getThoseThatInterestMe($me),这些方法从API返回数据。

现在我想创建一个ApiClientFacade类,它充当所有XxxClient类前面的接口,遵循Facade Pattern -例如,这个facade类将有一个方法getAllFoo(),然后调用FooClient::getAll(),等等……

我也可以将我的facade类定义为一个服务,但是它有太多的依赖项--我有大约30个客户端类。而且,使用这种方法,我每次都要加载所有30个依赖项,而大多数时候我只需要一个依赖项.

那么,有什么更好的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-03-29 23:23:46

使用额外的ApiClientFactory将“ApiClient对象的实例化”的责任从您的ApiFacade类中转移出来(正如我所理解的,这是您的最初想法)。

在一些伪-php代码中,我的想法是:

代码语言:javascript
复制
$api = new ApiFacade(new ApiClientFactory);
$api->sendNotificationAboutUserLogin('username', time());

方法的一个例子:

代码语言:javascript
复制
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应该是这样的:

代码语言:javascript
复制
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?
      }
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29335066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档