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が自動的にそれを注入すると思いました。
参照してくれた@svmmに感謝します コメントに記載されている質問 。 Eloquentフレームワークで機能しないコンストラクターの署名を変更する必要があるため、モデルで依存性注入を使用できないことがわかりました。
コードをリファクタリングしているときに中間ステップとして行ったことは、コンストラクターでApp::make
を使用して、次のようなオブジェクトを作成することです。
class Surface extends Model{
public function __construct()
{
$this->zipCode = App::make('App\Repositories\ZipCodeRepositoryInterface');
}
そうすれば、IoCは実装されたリポジトリを引き続き取得します。関数をリポジトリにプルして依存関係を削除できるようになるまで、これを実行しているだけです。
Laravel 5.7では、グローバルresolve(...)
メソッドを使用できます。グローバルApp
がLaravelの最新バージョンで定義されているとは思いません。
$myService = resolve(ServiceName::class);
Laravel docs で解決