【问题标题】:Implementing similar functionality to Cache::disk('x') in Laravel在 Laravel 中实现与 Cache::disk('x') 类似的功能
【发布时间】: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 可以轻松访问实例.

不是真的在这里寻找代码 - 这将是简单的部分。我只是不确定我是否真的了解了这一点,并正在寻找正确方向的推动力..

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以我会放弃接口绑定,并实现一个工厂类来实例化我想要使用的任何服务(并且在配置中有一个默认值)?然后我把工厂类装上去?
    • 我已将此标记为已回答,因为它把我推向了正确的方向 - 但我的实现看起来很草率,所以我将创建一个新问题 :)
    • 在此处包含问题的链接。
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    相关资源
    最近更新 更多