とにかくあなたのパッケージをユーザーのアプリケーションに統合するためには、サービスプロバイダを書く必要があるので、契約書を使って依存性注入によってパッケージを利用できるようにする必要があります。私はそれが便宜のためにファサードを提供することを傷つけるとは思っていません。なぜなら、本当にあなたのサービスプロバイダーの何かを参照する唯一の余分なファイルだからです。
あなたの契約:
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();
}
}
、
注:私はこれを直接ここに書いただけで、テストする機会はありませんでした。
ありがとう、ユーザーはどのように依存性注入を介してリポジトリのメソッドにアクセスしますか?彼らはリポジトリクラスを注入する必要がありますか?あるいは、彼らは単にパッケージ名を使うことができますか?あなたは私に大まかな例を見せてもらえますか?リポジトリクラスの場合は、リポジトリ名を知っているユーザーに依存していますが、ファサードは簡単に見えます。 – panthro
例を使って答えを更新しましたが、何もテストしませんでした。 – Jonathon
更新された答えをありがとう、私は依存性注入のためのリポジトリインタフェースを参照する必要があります。さらに質問があります。私はおそらくパッケージからのデータのさまざまな部分を扱う10のリポジトリを持っているとします。依存性注入については、私が望むリポジトリを注入すると仮定します。これはファサードでどのように機能しますか?私は複数のファサードが必要ですか?各リポジトリごとに1つですか?それとも別の方法がありますか? – panthro