Как обеспечить несколько реализаций для класса в Laravel? - PullRequest
0 голосов
/ 05 июня 2018

Мы используем геокодирование для кодирования нескольких записей.В зависимости от некоторых условий мы хотели бы перейти от реализации к другому (другому провайдеру).

Текущее объявление поставщика услуг:

// 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\StatefulGeocoderfinalТак что это не решение.

EDIT

Geocoder, кажется, поддерживает несколько провайдеров, так что это должно исправить это.Я оставляю вопрос открытым, потому что думаю, что общий ответ будет уместным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...