如何在Laravel中为一个类提供多个实现?
我们正在使用一些地理编码对一些条目进行编码。根据某些条件,我们希望从一个实现切换到另一个(不同的提供程序) 当前服务提供商声明:如何在Laravel中为一个类提供多个实现?,laravel,laravel-5,laravel-ioc,Laravel,Laravel 5,Laravel Ioc,我们正在使用一些地理编码对一些条目进行编码。根据某些条件,我们希望从一个实现切换到另一个(不同的提供程序) 当前服务提供商声明: // some skipped and irrelevant imports class GeocoderServiceProvider extends ServiceProvider { public function register() { $this->app->singleton(GoogleMaps::class,
// 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
。所以这不是一个解决方案
编辑
Geocoder
似乎支持多个提供者,所以这应该可以解决它。我将这个问题留待讨论,因为我认为一般性的答案是相关的。上下文绑定会有帮助吗?肯定是我不知道的,所以它的排名相当不错;)但是不适合这个例子,因为我想为同一个类提供两个实例。