Php 在Laravel中实现与Cache::disk(';x';)类似的功能

Php 在Laravel中实现与Cache::disk(';x';)类似的功能,php,laravel,laravel-5,Php,Laravel,Laravel 5,这只是一个关于我试图找到的解决方案的一般性问题 我可能有许多相同类型服务的提供者,我需要一种方法来拥有一个默认值,但也需要手动调用切换器方法来更改它们 目前,我已经通过配置设置将一个接口绑定到一个实现,这很有效——但这意味着每种服务类型只能支持一个活动提供者 我注意到Cache::disk()方法确实是我想要的,但我不确定应该在哪里定义这种类型的开关方法 当前: interface IProvider { public function getServiceInfo($args);

这只是一个关于我试图找到的解决方案的一般性问题

我可能有许多相同类型服务的提供者,我需要一种方法来拥有一个默认值,但也需要手动调用切换器方法来更改它们

目前,我已经通过配置设置将一个接口绑定到一个实现,这很有效——但这意味着每种服务类型只能支持一个活动提供者

我注意到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中加入了一个额外的要求-不确定我是否在这里混淆了契约/Facades-但本质上我希望接口能够强制执行实例方法,但是Facade可以方便地访问实例


不是真的在这里寻找代码-这将是容易的部分。我只是不确定我是否真的尝试过这一点,并寻找正确的方向。

使用接口来确保服务实现您需要的方法是有意义的

但是关于基于对象实例的属性使用不同的服务;对我来说,这听起来更像是
工厂
模式


所以我会放弃接口绑定,实现一个工厂类,它实例化我想要使用的任何服务(并且在配置中有一个默认值)?然后我将factory类虚化?我将其标记为已回答,因为它将我推向了正确的方向-但我的实现看起来很松散,因此我将创建一个新问题:)在此处包含问题的链接。这是