#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). Но вы также можете зарегистрировать несколько экземпляров с разными настройками, например.