これは私が探している解決策の周りの一般的な質問です。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して正しい方向に微妙なことを確かめていません。
だから私は、インターフェース結合をドロップすると、私が使用したいものは何でもサービスインスタンス(および設定のデフォルトを持っている)ファクトリクラスを実装するのでしょうか?私はファクトリークラスをファサードしますか? – Trent
私は正しい方向に私を押し込んだのでこれを答えたとマークしましたが、実装がうまく見えないので、新しい質問を作成します:) – Trent
ここに質問へのリンクを入れてください。 – fubar