在Laravel

时间:2017-04-04 01:09:59

标签: php laravel laravel-5

这只是围绕我想要找到的解决方案的一般性问题。

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

目前,我通过配置设置绑定了一个实现接口,这很有效 - 但这意味着我只能为每种类型的服务支持一个活动提供程序。

我注意到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可以轻松访问实例

这里不是真的在寻找代码 - 这将是一件容易的事。我只是不确定我是否真的想要这个并且正朝着正确的方向努力......

1 个答案:

答案 0 :(得分:0)

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

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

http://www.phptherightway.com/pages/Design-Patterns.html