Мы используем геокодирование для кодирования нескольких записей.В зависимости от некоторых условий мы хотели бы перейти от реализации к другому (другому провайдеру).
Текущее объявление поставщика услуг:
// some skipped and irrelevant imports
class GeocoderServiceProvider extends ServiceProvider {
public function register() {
$this->app->singleton(GoogleMaps::class, function($app) {
$adapter = $app->make(Client::class);
$regionBiaising = 'US';
$apiKey = $app['config']->get('services.googleGeocoding.apiKey');
return new GoogleMaps($adapter, $regionBiaising, $apiKey);
});
$this->app->singleton(Geocoder::class, function($app) {
$provider = $app->make(GoogleMaps::class);
return new StatefulGeocoder($provider, 'en');
});
}
}
Текущее внедрение:
class SomeClientClass {
/**
* @var Geocoder
*/
private $geocoder;
public function __construct(Geocoder $geocoder) {
$this->_geocoder = $geocoder;
}
// some code doing useful things
}
Цель состоит в том, чтобы добиться чего-то подобного:
class SomeClientClass {
/**
* @var Geocoder
*/
private $geocoder;
public function __construct(Geocoder $geocoder, Whatever $alternativeGeocoder) {
$this->_geocoder = ($condition) ? $geocoder : $alternativeGeocoder;
}
// some code doing useful things
}
Я попытался взломать мой путь, сделав поддельный подкласс для моей альтернативы Geocoder
, к сожалению Geocoder\StatefulGeocoder
final
Так что это не решение.
EDIT
Geocoder
, кажется, поддерживает несколько провайдеров, так что это должно исправить это.Я оставляю вопрос открытым, потому что думаю, что общий ответ будет уместным.