ERROR:Target [RepositoryInterface] is not instantiable while building [Errorファイル名]

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

まずは正解のコードを記載します。

これを下のように間違えた記載をしていたことがエラーの原因でした。

Application::bindはふたつ以上のペアを渡せない

RepositoryInterfaceとRepositoryの組み合わせを登録するメソッドなのに間違えたコードではbindの中に4つも入ってます。

Application::bind は、第一引数の文字列をキーにして第二引数のクラス(のインスタンス)を値にするためのメソッドなので、ふたつ以上のペアを一度に渡すことはできないのです。

インタフェースごとに bind を呼ぶ

つまりはこのルールを無視したからエラーになったわけですね。

▼ 解決情報 参考元

https://qiita.com/antk/items/38971fba1de4e6872b82

まとめ

「そもそもインスタンス化ってなんでする?」という疑問ありますよね。私もそう思ってました。
「ServiceでModelを呼び出せば良いのに、なぜRepositoryに書き出すのか」とか「Repositoryをstaticで作って呼び出せばインスタンス化する必要ないじゃん」とか。

それらの疑問については、下記参考サイトを一読することをお勧めします。
https://qiita.com/minato-naka/items/a4531797af611688db97
https://qiita.com/_ha1f/items/1378dc6926e29bd01206

以下はコードを書いていて思った私的な感想ですがメモしておきます。
現在の開発はチームで行うことが多いと思います。
その際、人のコードを見ることももちろんあります。
コンストラクタインジェクションを行なっていると、コードの前段でどんなClassを利用しているかがとても明確になります。
そのため、解析する時間が圧倒的に短くなりますし、細かくClass分けをしていると(書くときは面倒臭いですが)修正箇所を探し出す時間が短縮できます。
時間と共にコードの中身なんて忘れますからね。
面倒ですが、便利です。