2017-04-04 45 views
0

這只是圍繞我試圖找到的解決方案的一個普遍問題。在Laravel中實現與Cache :: disk('x')類似的功能

我有潛在的許多相同類型的服務提供商,我需要一種方式能夠有一個默認的,但是然後也手動調用切換器方法來改變它們。

目前,我已經通過配置設置將接口綁定到實施,這很好 - 但這意味着我只能支持每種服務的一個活動提供商。我注意到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); 
    } 
} 

我知道我扔在一個額外的要求,有門面的 - 不知道我在這裏已經糊塗了合同/外立面 - 但本質上我希望接口執行實例方法,但外觀容易訪問實例。

不是真的在這裏尋找代碼 - 這將是容易的部分。我只是不確定我是否真的注意到了這一點,並尋找正確方向的微調。

回答

0

使用接口來確保服務實現您需要的方法是有意義的。

但是關於基於對象實例的屬性使用不同的服務;這聽起來更像我的Factory模式。

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

+0

所以我會放棄的界面結合,並實現了一個工廠類實例化任何服務,我想使用(並有一個默認的配置)?然後,我在工廠課堂外觀? – Trent

+0

我已將此標記爲已回答,因爲它將我推向了正確的方向 - 但我的執行看起來很sl,,所以我將創建一個新問題:) – Trent

+0

在此處包含問題的鏈接。 – fubar

相關問題