我必须通过 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)进行依赖注入.
我知道这可能是一个奇怪的用例,但是:在这种情况下你会怎么做?
预先感谢您的帮助!