2017-04-04 4 views
0

これは私が探している解決策の周りの一般的な質問です。LaravelでCache :: disk( 'x')と同様の機能を実装しています

私は同じタイプのサービスを提供する可能性のあるプロバイダーが多く、デフォルトを持つことができる方法が必要ですが、手動でスイッチャーメソッドを呼び出して変更する方法も必要です。

現在、インターフェイスを実装設定にバインドしましたが、これはうまく機能しますが、サービスの種類ごとに1つのアクティブなプロバイダしかサポートできないことを意味します。

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); 
    } 
} 

は、私はそこファサードの追加要件に投げてきた知っているが、本質的に、私は、インターフェイスがインスタンスメソッドを強制したいのですが、簡単のためのファサードインスタンスへのアクセス。

ここではコードを探していません。これは簡単な部分です。私は実際にこれをgrok'dして正しい方向に微妙なことを確かめていません。

答えて

0

あなたが必要とする方法を実装するサービスを実現するためにインターフェイスを使用することは理にかなっています。

しかし、オブジェクトインスタンスのプロパティに基づいて別のサービスを使用することに関しては、私にはFactoryパターンのように聞こえる。

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

+0

だから私は、インターフェース結合をドロップすると、私が使用したいものは何でもサービスインスタンス(および設定のデフォルトを持っている)ファクトリクラスを実装するのでしょうか?私はファクトリークラスをファサードしますか? – Trent

+0

私は正しい方向に私を押し込んだのでこれを答えたとマークしましたが、実装がうまく見えないので、新しい質問を作成します:) – Trent

+0

ここに質問へのリンクを入れてください。 – fubar

関連する問題