这只是围绕我想要找到的解决方案的一般性问题。
我可能有许多相同类型服务的提供商,我需要一种能够拥有默认值的方法,但还需要手动调用切换器方法来更改它们。
目前,我通过配置设置绑定了一个实现接口,这很有效 - 但这意味着我只能为每种类型的服务支持一个活动提供程序。
我注意到Cache :: disk()方法正是我正在寻找的,但我不确定应该在哪里定义这种类型的切换方法。
电流:
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可以轻松访问实例
这里不是真的在寻找代码 - 这将是一件容易的事。我只是不确定我是否真的想要这个并且正朝着正确的方向努力......
答案 0 :(得分:0)
使用接口确保服务实现您需要的方法是有意义的。
但是关于使用基于对象实例的属性的不同服务;这对我来说听起来更像Factory
模式。