2016-11-24 10 views
1

私はlaravelパッケージを開発しています。パッケージ内には、データを扱うリポジトリがあります。パッケージメソッドにアクセスするには?

ユーザーがパッケージをインストールすると、アプリケーションのリポジトリとのやりとりをどのようにすることができますか?

SuperPackage::getSomeData(); 

または私は別の方法を使用する必要があります:彼らはのような何かを行うことができますので、

は私がファサードを設定すべきか?

ドキュメントの状態:

Laravelと相互作用して、サードパーティ製のパッケージを構築し、それは がファサードを使用する代わりに、Laravel契約を注入する方が良いでしょう。 パッケージはLaravelの外に構築されているので、Laravelのファサードテストヘルパーには にアクセスできません。

これは、パッケージの内部を意味するもので、パッケージを外部から呼び出すと仮定します。ファサードはまだ問題ありませんか?

答えて

4

とにかくあなたのパッケージをユーザーのアプリケーションに統合するためには、サービスプロバイダを書く必要があるので、契約書を使って依存性注入によってパッケージを利用できるようにする必要があります。私はそれが便宜のためにファサードを提供することを傷つけるとは思っていません。なぜなら、本当にあなたのサービスプロバイダーの何かを参照する唯一の余分なファイルだからです。

あなたの契約:

namespace Your\Package; 

public interface YourPackageContract 
{ 
    public function availableMethod(); 
} 

あなたの実装:

namespace Your\Package; 

class YourPackage implements YourContract 
{ 
    public function availableMethod() 
    { 
     // Implement your method 
    } 
} 

サービスプロバイダ:

namespace Your\Package; 

use Illuminate\Support\ServiceProvider; 

class YourPackageServiceProvider extends ServiceProvider 
{ 
    public function register() 
    { 
     // Tell Laravel that when an instance of YourPackageContract is requested, an instance of YourPackage should be returned 
     $this->app->singleton('Your\Package\YourPackageContract', function($app) { 
      return new YourPackage(); 
     }); 
    } 

    public function provides() 
    { 
     return ['Your\Package\YourPackageContract']; 
    } 
} 

あなたのファサード:コントローラで

namespace Your\Package\Facades; 

use Illuminate\Support\Facades\Facade; 

class YourPackage extends Facade 
{ 
    public function getFacadeAccessor() 
    { 
     return 'Your\Package\YourPackageContract'; 
    } 
} 

は使用法:あなたのクラスにアクセスするための複数の方法を作成する場合は、常にあなたのサービスプロバイダに->alias()方法を使用することができ

class SomeController 
{ 
    public function index(YourPackageContract $yourPackage) 
    { 
     // $yourPackage should now be an instance of YourPackage 
     $yourPackage->availableMethod(); 

     // You can also use the Facade which refers to the same instance 
     YourPackage::availableMethod(); 
    } 
} 

注:私はこれを直接ここに書いただけで、テストする機会はありませんでした。

+0

ありがとう、ユーザーはどのように依存性注入を介してリポジトリのメソッドにアクセスしますか?彼らはリポジトリクラスを注入する必要がありますか?あるいは、彼らは単にパッケージ名を使うことができますか?あなたは私に大まかな例を見せてもらえますか?リポジトリクラスの場合は、リポジトリ名を知っているユーザーに依存していますが、ファサードは簡単に見えます。 – panthro

+0

例を使って答えを更新しましたが、何もテストしませんでした。 – Jonathon

+0

更新された答えをありがとう、私は依存性注入のためのリポジトリインタフェースを参照する必要があります。さらに質問があります。私はおそらくパッケージからのデータのさまざまな部分を扱う10のリポジトリを持っているとします。依存性注入については、私が望むリポジトリを注入すると仮定します。これはファサードでどのように機能しますか?私は複数のファサードが必要ですか?各リポジトリごとに1つですか?それとも別の方法がありますか? – panthro

関連する問題