如何在Laravel中为类提供多个实现?

时间:2018-06-05 14:52:05

标签: laravel laravel-5 laravel-ioc

我们正在使用一些地理编码来编码一些条目。根据某些条件,我们希望从实现切换到另一个(不同的提供者)。

当前服务提供商声明:

// 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。所以这不是一个解决方案。

修改

Geocoder似乎支持多个提供商,所以这应该解决它。我打开这个问题,我认为一般的答案是相关的。

0 个答案:

没有答案