Error Class 'League\Flysystem\AwsS3v3\AwsS3Adapter' not foundの解決方法

Laravel初学者です。
オリジナルアプリを作成しているのでその過程を記事にしています。

理解が曖昧なところも多いため、ご指摘等ありましたらご連絡いただければ幸いです。

今回は
`Error
Class 'League\Flysystem\AwsS3v3\AwsS3Adapter' not found`
が出たのでその解決方法を記録として残します。

エラーが出るまでの流れを記載するので長くなってます。


## 環境

|                | Version     |
|:---------------|------------:|
| PHP            | 7.4.14      |
| Laravel        | 8.24.0      |
| mysql          | 8.0.23      |
| docker         | 20.10.2     |
| docker-compose | 1.27.4      |

## 何をしようとしたのか

[こちらの記事](https://qiita.com/nobu0717/items/51dfcecda90d3c5958b8)を参考にAWSで画像を保存できるようにしようとしました。


## ソースコード

```PHP:新規投稿画面のview
<h1>新規作成</h1>

<form action="{{ route('game.store') }}" method="POST" id="new">
  @csrf

  <div>
    <label>名前</label><br />
    <input type="text" name="name" value="{{old('name')}}">
  </div>

  <div>
    <label>画像</label><br />
    <input type='file' name="image" accept="image/png, image/jpeg">
  </div>

  <div>
    <label>説明</label><br />
    <textarea id="new" name="describe" value="{{old('describe')}}"></textarea>
  </div>

  <input type="submit" value="登録する">

</form>
```

一般的なFORMです。
storeメソッドで保存しようと思いました。

```PHP:マイグレーションファイル
public function up()
    {
        Schema::create('games', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->text('describe');
            $table->string('image_path')->nullable();
            $table->timestamps();
        });
    }
```

上記はマイグレーションファイルのカラムの構成です。


```PHP:モデル
class Game extends Model
{
    use HasFactory;

    protected $table = "games";
	protected $fillable = [
        "id",
        "name",
        "describe",
        "image_path",
        "updated_at",
        "created_at",
    ];
}
```

上記はモデルの記述です。

## 実装の流れ

①[ails, Laravel(画像アップロード)向けAWS(IAM:ユーザ, S3:バケット)の設定](https://qiita.com/nobu0717/items/4425c02157bc5e88d7b6)
でAWSのを使うための設定をする
②[LaravelでAWS S3へ画像をアップロードする](https://qiita.com/nobu0717/items/51dfcecda90d3c5958b8)
この記事を参考に進めました。

記事の通りに最後まで進め、いざ投稿ができるか確認してみようとsubmitを押すと

![スクリーンショット 2021-02-02 15.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/d379831d-e0f4-c15a-b186-a9f8d12bbf83.png)

上記のように　
`Error Class 'League\Flysystem\AwsS3v3\AwsS3Adapter' not found`
のエラーになりました。

素直にエラー文をみると「クラスの定義がされていないとのこと」で`namespaceやuseが定義されていないのか`と思いましたが、該当のファイルを見てみたらきちんと定義されていました。


`flysystem-aws-s3-v3`がインストールされていないのかと思いましたが

```PHP:composer.json
"league/flysystem-aws-s3-v3": "^2.0"
```

と、composer.jsonに記載されていたのでインストールされています。

念のため、再度参考にした記事の通りに
`composer require league/flysystem-aws-s3-v3`
を試してみたところ

![スクリーンショット 2021-02-04 15.13.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/30dbf6e2-cd10-d909-b4ab-25746474d87a.png)

上記のようなエラーが出ました。

## teratailで質問

困ったので[teratail](https://teratail.com/questions/320393)で質問させていただいたところ
「上記のエラー文を見る限り`league/flysystem`のバージョンが古くて`league/flysystem-aws-s3-v3`の2.0以上に対応していないんじゃないでしょうか。
`league/flysystem-aws-s3-v3`のほうを対応しているバージョンに下げるか、`league/flysystem`のバージョンを上げるしかないと思います。」
と丁寧に回答いただきました。

[こちら](https://stackoverflow.com/questions/65002425/league-flysystem-aws-s3-v3-on-laravel-8-other-packages-require-lower-version)が同じようなエラーが出た方の記事です。

上記記事を参考に`composer require league/flysystem-aws-s3-v3:"^1.0"`とバージョンを指定してインストールしてみようと思います。

```PHP
COMPOSER_MEMORY_LIMIT=-1 composer require league/flysystem-aws-s3-v3:"^1.0"
```

私は上記のようにメモリ不足を一時的に解消する`COMPOSER_MEMORY_LIMIT=-1`をつけてインストールしました。
(Fatal error: Allowed memory size of 1610612736 bytes exhaustedとエラーが出た場合は`COMPOSER_MEMORY_LIMIT=-1'をつけます)

そうすると

![スクリーンショット 2021-02-04 15.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051152/92fff8e4-3d5b-1410-d878-0ba919cccbc0.png)

上記のように
最後`killed`で止まってしましました。
これはメモリ不足で負荷がかかる前に勝手に止まってしまう動作のようです。

[こちら](https://qiita.com/makies/items/3e1064f17a18df750cad)の記事を参考にメモリを増やしました。

その後
`COMPOSER_MEMORY_LIMIT=-1 composer require league/flysystem-aws-s3-v3:^1.0`を再実行し無事に成功しました。

```PHP:composer.json
"league/flysystem-aws-s3-v3": "^1.0"
```

成功した後はcomposer.jsonのバージョンも1.0になっていました。
うまくいかない時は`composer install`を試すのもいいみたいです。