web-dev-qa-db-ja.com

モデルへのLaravel5依存性注入

ZipCodeRepositoryオブジェクトに依存するSurfaceというEloquentモデルがあります。

class Surface extends Model{
    public function __construct(ZipCodeRepositoryInterface $zipCode){...}

そして、多くのサーフェスを持つAddressオブジェクト。

class Address extends Model{
    public surfaces() { return $this->hasMany('App/Surface'); }
}

私の問題は、$address->surfacesを呼び出すと次のエラーが発生することです。

Argument 1 passed to App\Surface::__construct() must be an instance of App\Repositories\ZipCodeRepositoryInterface, none given

IoCが自動的にそれを注入すると思いました。

12
ajon

参照してくれた@svmmに感謝します コメントに記載されている質問 。 Eloquentフレームワークで機能しないコンストラクターの署名を変更する必要があるため、モデルで依存性注入を使用できないことがわかりました。

コードをリファクタリングしているときに中間ステップとして行ったことは、コンストラクターでApp::makeを使用して、次のようなオブジェクトを作成することです。

class Surface extends Model{
    public function __construct()
    {
        $this->zipCode = App::make('App\Repositories\ZipCodeRepositoryInterface');
    }

そうすれば、IoCは実装されたリポジトリを引き続き取得します。関数をリポジトリにプルして依存関係を削除できるようになるまで、これを実行しているだけです。

22
ajon

Laravel 5.7では、グローバルresolve(...)メソッドを使用できます。グローバルAppがLaravelの最新バージョンで定義されているとは思いません。

$myService = resolve(ServiceName::class);

Laravel docs で解決

2
Michael Rivera