用户登录到应用程序后,我需要执行一个接口来实现绑定。登录时,用户选择一个环境,并根据该环境执行绑定。我已将以下绑定添加到AppServiceProvider
,但似乎在执行登录之前已将其引导。
$providerClass = 'App\Models\\' . ucfirst($provider);
$this->app->bind(
'App\Repositories\MyRepository',
$providerClass
);
是否有可能从控制器绑定此对象,或者将是根据用户选择的环境将接口绑定到相应实现的替代方法?
正如@PtrTon所说,尽管这是一个创意,但这是一个坏主意。您可以在此处考虑laravel寄存器模式。
注册表类:
class EnvironmentGatewayRegistry {
protected $gateways = [];
function register ($name, EnvironmentGateway $instance) {
$this->gateways[$name] = $instance;
return $this;
}
function get($name) {
if (in_array($name, $this->gateways)) {
return $this->gateways[$name];
} else {
throw new Exception("Invalid gateway");
}
}
}
您的服务提供商
$this->app->singleton(EnvironmentGatewayRegistry::class);
$this->app->make(EnvironmentGatewayRegistry::class)
->register("dev", new DevImplemetaionClass())
->register("prod", new ProdImplemetaionClass());
在您的控制器/您想要的任何地方,您都可以注入类EnvironmentGatewayRegistry
并以诸如dev
,prod
作为寄存器名称的参数调用get方法。
[更多参考,请检查此文件http://rizqi.id/laravel-registry-pattern