如何在这种特殊情况下处理 OOP

时间:2021-04-12 19:40:19

标签: php oop inheritance dependency-injection drupal

我必须通过 Soap 和 Rest 服务将我的 Drupal 应用程序与第三方 API 集成。

我想尽可能地正交!但是我对我得出的结果并不满意,我在这里寻求帮助,因为我不想浪费太多时间。

这些是我抽象的 Rest and Soap 服务:

 abstract class RestService {

  protected $config;

  protected $httpClient;

  public function __construct(ConfigFactoryInterface $configFactory) {
    $this->config = $configFactory->get('third_party.rest_service');
    $this->httpClient = new Client(['base_uri' => $this->setBaseUri()]);
  }

  protected abstract function setBaseUri();

}

abstract class SoapService {

  protected $client;

  protected $credentials;

  public function __construct(ConfigFactoryInterface $configFactory) {
    $config = $configFactory->get('third_party.soap_service');
    $this->client = new SoapClient($config->get('wsdl_url'));
    $this->credentials = new SoapCredentials();
  }

}

现在是“专业”服务:

class AuthService extends RestService {

  protected function setBaseUri() {
    return $this->config->get('auth_basepath');
  }

  public function getAccessToken() {
    $accessToken = $this->config->get('access_token');

    if (!$this->isTokenValid($accessToken)) {
      $accessToken = $this->refreshToken();
    }

    return $accessToken;
  }

  protected function isTokenValid($accessToken) {...}

}


class ContactsService extends SoapService {

  public function __construct(ConfigFactoryInterface $configFactory, AuthService $authService) {
    parent::__construct($configFactory);

    $this->credentials->password = $authService->getAccessToken();
  }

  public function ... {}

}


class EventsService extends RestService {

  protected $accessToken;

  public function __construct(ConfigFactoryInterface $configFactory, AuthService $authService) {
    parent::__construct($configFactory);

    $this->accessToken = $authService->getAccessToken();
  }

  protected function setBaseUri() {
    return $this->config->get('events_basepath');
  }

  public function getEvents(array $filters = null) {...}

}

如您所见,AuthService 用于获取访问令牌,并在soap 和rest 认证的api 调用中使用它,但它扩展了RestService,因为EventsService 已经这样做了。

我的疑问是在 EventsService 实际上,我不知道这是否是一个好的做法,那就是对扩展“容器”(EventsService 本身)的同一类的类(AuthService)进行依赖注入.

我知道这可能是一个奇怪的用例,但是:在这种情况下你会怎么做?

预先感谢您的帮助!

0 个答案:

没有答案