ERROR:Target [RepositoryInterface] is not instantiable while building [Errorファイル名]
Target [RepositoryInterface] is not instantiable while building [Errorファイル名]
こんなエラーに遭遇しました。
Controllerで__constractに引数としてInterfaceを記載しインスタンス化しようとした時のことです。
原因はproviderの記載ミス
app/Providers/RepositoryServiceProvider.php
まずは正解のコードを記載します。
1 2 3 4 5 6 7 8 |
$this->app->bind( 'App\Repositories\Document\DocumentRepositoryInterface', 'App\Repositories\Document\DocumentRepository', ); $this->app->bind( 'App\Repositories\Document\DocumentCollectionRepositoryInterface', 'App\Repositories\Document\DocumentCollectionRepository', ); |
1 2 3 4 5 6 |
$this->app->bind( 'App\Repositories\Document\DocumentRepositoryInterface', 'App\Repositories\Document\DocumentRepository', 'App\Repositories\Document\DocumentCollectionRepositoryInterface', 'App\Repositories\Document\DocumentCollectionRepository', ); |
Application::bindはふたつ以上のペアを渡せない
Application::bind は、第一引数の文字列をキーにして第二引数のクラス(のインスタンス)を値にするためのメソッドなので、ふたつ以上のペアを一度に渡すことはできないのです。
インタフェースごとに bind を呼ぶ
つまりはこのルールを無視したからエラーになったわけですね。
▼ 解決情報 参考元
まとめ
「そもそもインスタンス化ってなんでする?」という疑問ありますよね。私もそう思ってました。
「ServiceでModelを呼び出せば良いのに、なぜRepositoryに書き出すのか」とか「Repositoryをstaticで作って呼び出せばインスタンス化する必要ないじゃん」とか。
それらの疑問については、下記参考サイトを一読することをお勧めします。
https://qiita.com/minato-naka/items/a4531797af611688db97
https://qiita.com/_ha1f/items/1378dc6926e29bd01206
以下はコードを書いていて思った私的な感想ですがメモしておきます。
現在の開発はチームで行うことが多いと思います。
その際、人のコードを見ることももちろんあります。
コンストラクタインジェクションを行なっていると、コードの前段でどんなClassを利用しているかがとても明確になります。
そのため、解析する時間が圧倒的に短くなりますし、細かくClass分けをしていると(書くときは面倒臭いですが)修正箇所を探し出す時間が短縮できます。
時間と共にコードの中身なんて忘れますからね。
面倒ですが、便利です。
-
前の記事
array_merge(): Argument #1 must be of type array, null given phpunitエラーで動けない 2022.08.02
-
次の記事
LaravelでPDF出力したいけど結局何がベストなのか 2022.08.09
コメントを残す