Как я должен использовать контейнер IOC с зависимостями, который использует другие зависимости?

#php #laravel

#php #laravel

Вопрос:

В настоящее время я рефакторингую свой код для проверки Google Play в App Purchases для серверной части моего приложения, и я не уверен, какое лучшее решение для инициализации классов, предоставляемых Google SDK.

SDK от Google, который я использую:https://github.com/googleapis/google-api-php-client

Для проверки я использую этот пакет composer:https://github.com/aporat/store-receipt-validator

Мой предыдущий код для этого:

 class GooglePlayIAPService extends InAppPurchaseService
{
    public function __construct(UserService $userService)
    {
        parent::__construct($userService);

        $googleClient = new Google_Client();
        $googleClient->setScopes([Google_Service_AndroidPublisher::ANDROIDPUBLISHER]);
        $googleClient->setApplicationName('My app name');
        $googleClient->setAuthConfig(config('app.iap_service_credentials.google'));

        $googleAndroidPublisher = new Google_Service_AndroidPublisher($googleClient);

        $this->googleValidator = new ReceiptValidatorGooglePlayValidator($googleAndroidPublisher);
    }


    /* The validation functions... */

}
  

Я хочу заменить новые вызовы вызовами контейнера IOC, но моя проблема здесь в том, что Google_Service_AndroidPublisher требуется инициализированный экземпляр Google_Client .
Мой подход заключался в использовании App::makeWith(...) , но я не совсем доволен этим решением…

 class GooglePlayIAPService extends InAppPurchaseService
{
    public function __construct(UserService $userService, Google_Client $googleClient)
    {
        parent::__construct($userService);

        $googleClient->setScopes([Google_Service_AndroidPublisher::ANDROIDPUBLISHER]);
        $googleClient->setApplicationName('My app name');
        $googleClient->setAuthConfig(config('app.iap_service_credentials.google'));

        $googleAndroidPublisher = App::makeWith(Google_Service_AndroidPublisher::class, ['googleClient' => $googleClient]);

        $this->googleValidator = App::makeWith(GoogleValidator::class, ['googleServiceAndroidPublisher' => $googleAndroidPublisher]);
    }


    /* Validation functions */
}
  

Или, может быть, другой подход заключался бы в Google_Client полной инициализации в AppServiceProvider , но это привело бы к потере гибкости…

Итак, мой вопрос: есть ли другое хорошее решение для этого, которое также позволяет легко издеваться и тестировать?

Комментарии:

1. Почему вы не регистрируете все три службы в своем поставщике приложений и не внедряете валидатор только там, где он вам нужен?

2. Причина потери гибкости. Что, если я хочу использовать другое имя приложения, например

3. Это небольшая проблема, если вы не можете заменить его во время выполнения (у меня нет опыта работы с этим конкретным SDK). Но вы также можете зарегистрировать несколько экземпляров с разными настройками, например.