【Laravel】リポジトリパターン実装におけるエラー Target [App\Repositories\UserRepositoryInterface] is not instantiable while building 

## 3行で

- Userリポジトリが読み込めない
- なぜか他のリポジトリは読める（例えばArticlesRepositoryとか）
- AppServiceProvider.php を見直す

## 概要

**「マイページにユーザーが投稿した記事を、ユーザー名に基づいてArticlesテーブルから持ってくる」**というパターンで実装する

## リポジトリパターン実装における各ファイル

### 実装クラス

```php:UserRepository.php
<?php

namespace App\Repositories\User;

// Modelディレクトリを作るパターンで実装している
use App\Models\User;

class UserRepository implements UserRepositoryInterface
{
  protected $user;

    /**
    * @param object $user
    */

  public function __construct(User $user)
  {
      $this->user = $user;
  }

  public function getUser($name)
  {
    return $this->user->where('name', $name)->first();
  }
}
```

### インターフェース

```php:UserRepositoryInterface.php
<?php

namespace App\Repositories\User;

interface UserRepositoryInterface
{
    public function getUser($name);
}
```

### コントローラ

```php:UserController.php
<?php

namespace App\Http\Controllers;
use App\Repositories\User\UserRepositoryInterface;

use App\Models\User;
use Illuminate\Http\Request;

class UserController extends Controller
{    
    protected $user;

    public function __construct(UserRepositoryInterface $userRepository)
    {
        $this->userRepository = $userRepository;
    }

    public function show(String $name)
    {
        $user = $this->userRepository->getUser($name);

        $articles = $user->articles->sortByDesc('create_at');

        return view('users.show', [
            'user' => $user,
            'articles' => $articles,
        ]);
    }
}
```

### サービスプロバイダ

下記のコードでエラーが起きた。

```php:AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */

    /**
     * Bootstrap any application services.
     *
     * @return void
     */

    public function boot()
    {
        //
    }

    // インターフェースと実装クラスを登録
    public function register()
    {
        $this->app->bind(
            \App\Repositories\Article\ArticleRepositoryInterface::class,
            \App\Repositories\Article\ArticleRepository::class,
            \App\Repositories\User\UserRepositoryInterface::class,
            \App\Repositories\User\UserRepository::class
        );
    }
}
```

これが問題だったが、自分の知る限り（あと調べた限り）ではこのパターンで実装できている。
3日くらい悩んだりいろいろ試してたらこの記事を見つけた。

[Target [App\Interfaces\User\UserInterface] is not instantiable while building #1](https://github.com/felicianopj/laravel-repository-tutorial/issues/1)

試しに修正してみる。↓

```php:AppServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */

    /**
     * Bootstrap any application services.
     *
     * @return void
     */

    public function boot()
    {
        //
    }

    // インターフェースと実装クラスを登録
    public function register()
    {
        $this->app->bind(
            \App\Repositories\Article\ArticleRepositoryInterface::class,
            \App\Repositories\Article\ArticleRepository::class
        );
        $this->app->bind(
            \App\Repositories\User\UserRepositoryInterface::class,
            \App\Repositories\User\UserRepository::class
        );
    }
}
```

そしたら直った。
~~理由が正直わからないのでもしわかる方がいたら教えてください。~~

**教えていただきました（コメント欄参照）。**