Php 在Laravel中实现与Cache::disk(';x';)类似的功能
这只是一个关于我试图找到的解决方案的一般性问题 我可能有许多相同类型服务的提供者,我需要一种方法来拥有一个默认值,但也需要手动调用切换器方法来更改它们 目前,我已经通过配置设置将一个接口绑定到一个实现,这很有效——但这意味着每种服务类型只能支持一个活动提供者 我注意到Cache::disk()方法确实是我想要的,但我不确定应该在哪里定义这种类型的开关方法 当前:Php 在Laravel中实现与Cache::disk(';x';)类似的功能,php,laravel,laravel-5,Php,Laravel,Laravel 5,这只是一个关于我试图找到的解决方案的一般性问题 我可能有许多相同类型服务的提供者,我需要一种方法来拥有一个默认值,但也需要手动调用切换器方法来更改它们 目前,我已经通过配置设置将一个接口绑定到一个实现,这很有效——但这意味着每种服务类型只能支持一个活动提供者 我注意到Cache::disk()方法确实是我想要的,但我不确定应该在哪里定义这种类型的开关方法 当前: interface IProvider { public function getServiceInfo($args);
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中加入了一个额外的要求-不确定我是否在这里混淆了契约/Facades-但本质上我希望接口能够强制执行实例方法,但是Facade可以方便地访问实例
不是真的在这里寻找代码-这将是容易的部分。我只是不确定我是否真的尝试过这一点,并寻找正确的方向。使用接口来确保服务实现您需要的方法是有意义的 但是关于基于对象实例的属性使用不同的服务;对我来说,这听起来更像是
工厂
模式
所以我会放弃接口绑定,实现一个工厂类,它实例化我想要使用的任何服务(并且在配置中有一个默认值)?然后我将factory类虚化?我将其标记为已回答,因为它将我推向了正确的方向-但我的实现看起来很松散,因此我将创建一个新问题:)在此处包含问题的链接。这是