【发布时间】:2017-04-04 09:20:16
【问题描述】:
这只是一个关于我试图找到的解决方案的一般性问题。
我可能有许多相同类型服务的提供者,我需要一种方法来设置默认值,然后手动调用切换器方法来更改它们。
目前,我已通过配置设置将接口绑定到实现,并且效果很好 - 但这意味着我只能支持每种服务类型的一个活动提供者。
我注意到 Cache::disk() 方法确实是我正在寻找的,但我不确定应该在哪里定义这种类型的 switch 方法。
当前:
interface IProvider {
public function getServiceInfo($args);
public function setServiceInfo($args);
}
class GoldService implements IProvider {
// implementation of the two interface methods
}
class SilverService implements IProvider {
}
// ProviderServiceProvider
public function register()
{
$this->app->bind(
App/IProvider,
App/GoldService
);
}
// Controller
public function getServiceInfo(Service $serviceId)
{
$provider = $app->make('App/IProvider');
$provider->getServiceInfo($serviceId);
}
想要拥有。
// What I want to be able to do
public function getServiceInfo(Service $serviceId)
{
// Using a facade
if ($serviceId > 100)
{
Provider::getServiceInfo($serviceId);
}
else
{
Provider::switch('SilverService')
->getServiceInfo($serviceId);
}
}
我知道我已经在 Facade 那里提出了一个额外的要求 - 不确定我是否在这里混淆了 Contracts/Facades - 但本质上我希望接口强制执行实例方法,但 Facade 可以轻松访问实例.
不是真的在这里寻找代码 - 这将是简单的部分。我只是不确定我是否真的了解了这一点,并正在寻找正确方向的推动力..
【问题讨论】: