【備忘録】Laravel 6でユーザー認証作る時につまずいたけど解決した方法共有!!

# はじめに
こんばんは!
私は、毎週、「1週間1制作計画」っていうのをやっています。
最近は、PHPの勉強を始めたので、今週は、PHP及びLaravelの練習を兼ねてLaravelでアプリケーションを制作してみようと思っていました。

そこで、認証機能をつけようと思い、Laravelに標準装備されている認証機能Authを使ってみようと考え、トライしてみました!!

**...すると、めっちゃつまづいた!!**

今日の投稿では、そのつまづいた部分について、解決した方法を、認証機能の実装方法と共に記録していきます!
また、その方法自体は最後に記載されている参考資料・文献を参考に実装しました。

# まずはLaravel 6をインストールしたい!!
Laravel 6をなぜ選んだかというと、サポート期間が最新のLaravel 8よりも長いためです(LTS = Long-Term-Support)。

一般的なインストール方法

```
laravel new プロジェクト名
```
ですよね!
しかし、今回は違います!以下のコードをご覧ください。

```
composer create-project "laravel/laravel=6.*" プロジェクト名
```
バージョンを指定して、Laravelをインストールする方法は、上記のように、composerを用います。
アプリケーションの実行には、通常通り、

```
php artisan serve
```
を使います。

# 標準装備Auth使っていきましょう!
それでは、いよいよ標準装備のAuthを使っていきます!
まずは、Auth機能を使うために、laravel/uiというパッケージを導入しましょう。

```
composer require laravel/ui:^1.0 --dev
```
上記コードをターミナルに入力して実行すると、認証部分のフロントエンドを制作できるlaravel/uiを導入することができます。
Auth関連のファイルを生成するために、以下の2つをターミナルに記述して実行します。

```
php artisan ui vue --auth
php artisan migrate
```

# php artisan migrateしたらエラー返ってきた!!
そうです、このphp artisan migrateしたら、以下のようなエラーが返ってきてしまいました。

```
   Illuminate\Database\QueryException  : SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = homestead and table_name = migrations)

  at /Users/username/code/LaravelSample/vendor/laravel/framework/src/Illuminate/Database/Connection.php:664
    660|         // If an exception occurs when attempting to run a query, we'll format the error
    661|         // message to include the bindings with SQL, which will make this exception a
    662|         // lot more helpful to the developer instead of just the database's errors.
    663|         catch (Exception $e) {
  > 664|             throw new QueryException(
    665|                 $query, $this->prepareBindings($bindings), $e
    666|             );
    667|         }
    668| 

  Exception trace:

  1   PDOException::("SQLSTATE[HY000] [2002] Connection refused")
      /Users/username/code/LaravelSample/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  2   PDO::__construct("mysql:host=127.0.0.1;port=3306;dbname=homestead", "homestead", "secret", [])
      /Users/username/code/LaravelSample/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:70

  Please use the argument -v to see more details.
```
正直、まだデータベースいじってないのに、何なんだ!!
「よくわからん!!調べても、Dockerを利用している人が多くて、自分の開発環境とは違うので参考にならん!!」
って感じでした。
なので、自分の手持ちのテキストに書いてあったように、そのまま以下をターミナルに記述して実行しちゃいました(笑)

```
npm install && npm run dev
```
そして、先ほど、アプリケーションを実行した時のように、

```
php artisan serve
```
を実行。
アプリケーションを開くことができる状態になります。
http://localhost:8000/
を開いてみてください。
![スクリーンショット 2020-09-22 23.09.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619752/8648a65a-e8c9-b5a6-cef0-42110f024379.png)
上の画像のようなページが開きます。最初に開いた時と変わらないようにも消えますが、
右上を見て頂くと、きちんと、LOGINとREGISTERと書かれていることがわかります。つまり、きちんと、Auth機能、実装できたんじゃないかと思いますよね!!
これが実は落とし穴...テキストでは触れられていない落とし穴だった。

# REGISTER(ユーザー登録)できない!?
まず、初めて利用するので、ユーザー登録をしてみます。
REGISTERを押して、ユーザー登録画面に遷移します。
そして、ユーザー名やメールアドレス、パスワードと言った、登録に必要なデータを入力します。
さぁ、REGISTERボタンを押して、登録だ!

```
Database name seems incorrect
You're using the default database name laravel. This database does not exist.
Edit the .env file and use the correct database name in the DB_DATABASE key.
```
なんか出てきた...泣

先ほど、php artisan migrate失敗した時もデータベース関連のエラーが出てきましたね。
今回も同じく、データベース関連のエラーです。データベース名が違うんですって。(incorrect)

次項から、この問題を解決していきます。

# まず、データベースに接続しよう!
Laravelプロジェクト作ってから全くいじっていなかったデータベースを、ついにいじっていきます!

## MySQLをインストール
MySQLをまずはインストールしましょう。以下をターミナルに記述して実行してください。

```
brew install mysql
```
インストールできたら、起動してください。

```
mysql.server start --skip-grant-tables
```
上記の方法で起動すると、パスワード不要でした!
その後、ルートユーザーで接続。

```
mysql -uroot
```

## データベースを作っていきましょう
それでは、続いて、データベースを作っていきます。
最初に、以下のコマンドを記述して、現在のデータベースの様子をチェックします。

```
mysql> show databases;
```
ダッシュ(途切れ途切れのあの線)で囲われて、Databaseっていうのが出てきます。出てきたらオッケーです。
次に、新しくデータベースを作成するコマンドを記述して実行してください。

```
create database sample;
```
私が、上記でsampleと記述した部分は、みなさんの任意の名前です。
そしてもう一度、show databases;で、データベースの状況を確認します。出力結果に、ここでいう、sampleが含まれていたら問題ないです!

## rootユーザーのパスワードの変更
MySQLのrootユーザーのパスワードの変更を行います。

```
mysql> FLUSH PRIVILEGES;

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'secret';
```
上記を実行してください。
それぞれ、実行直後には、Query OK, なんちゃらとかいうのが返ってきたらOKです!
ここでは、rootユーザーのパスワードを、「secret」に変更しています。
こちらも特に決まりはないので、任意の言葉で。
まぁ、サンプルコードでよく見るのは、secretですね(笑)

この処理が終了すれば、一旦MySQLを終了してから再起動させます。以下のコマンドを入力。

```
mysql> exit
```
再起動

```
mysql.server restart
```

## 認証プラグインの変更
ここで、すいません、MySQLをまた違う方法で開きたいので、またまたexitをお願いします。
以下のコマンドでMySQLに接続してください。

```
mysql -uroot -p
```
その後、Enter Passwordと言われ、パスワードの入力を求められます。
先ほど、変更したルートユーザーのパスワード、secretを入力してください。
接続できたら、次のコマンドを実行。

```
SELECT user, host, plugin FROM mysql.user;
```
SELECT文が出てきたら、ようやくデータベースいじってる感出てきましたねー!
上記コマンドで現状の認証プラグインを調べることができます。
おそらく、caching_sha2_passwordとなっているかと思います。
今回は、mysql_native_passwordを使いたいので、変更しましょう。以下のコマンドを実行してください。

```
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'secret';
```
それでは、再度、以下のコマンドで確認してみましょう。

```
SELECT user, host, plugin FROM mysql.user;
```
root項目のプラグインが、caching_sha2_passwordだったのに、mysql_native_passwordに変更されているかと思います。

## あと少し!.envファイルの編集をしよう!
一旦、ターミナルからは離れて、エディタに移動してください。
作成したプロジェクトのフォルダ内に、「.env」という名前のファイルがあると思います。そのファイルを開きましょう。
※examapleがついている.envファイルは違います!!今回編集するのは、ただの.envファイルです!

開いたらなんだかデータベースに関連しそうな内容がたくさん書かれています。
その中でも、以下のコメントアウトした部分を変更します。

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel // ココ変更するよ!
DB_USERNAME=root
DB_PASSWORD= // ココ変更するよ!
```
まず、DB_DATABASE=laravelの、laravelの部分を、sampleにします。
このsampleは、新しくデータベースを作った時に使った名前です。

DB_PASSWORD= は、元々空欄になっていますが、rootユーザーのパスワードとして設定した、secretを空欄部分に入れます。

最終的には、以下のような状態になるかと思います。

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=root
DB_PASSWORD=secret
```

編集後、またターミナルに帰りましょう。
キャッシュの削除を行います。

```
php artisan config:cache
```

## 最初できなかったphp artisan migrateしてみる!
この時点で、

```
php artisan migrate
```
してみると、成功します。

# REGISTERリベンジ!
もう一度、Laravelアプリケーションを実行してみましょう。

```
php artisan serve
```
ですね。
そしてもう一度、REGISTERに挑戦してみてください!!
すると、エラーは特に出ず、登録できるようになっています!!

# まとめ
長くなりましたが、数時間かけて格闘していたので、備忘録としてまとめてみました!
ここまでお読みくださり、ありがとうございました。
理解不足等による不備があれば、コメントお願い致します。

# 参考資料・文献
<a href="https://yaba-blog.com/laravel-db/#toc6">【Laravel】MySQLの接続方法を徹底解説【コピペでOK】</a>

<a href="https://qiita.com/daisu_yamazaki/items/a914a16ca1640334d7a5">更新！！Laravel6/7 (laravel/ui)でのLogin機能の実装方法〜MyMemo</a>

<a href="https://menta.work/post/detail/6134/IASoDSA5TqR7e5YFlm9w">【Laravel】Laravelでバージョンを指定してインストールする方法</a>

掌田津耶乃著『PHPフレームワーク Laravel入門 第2版』(2020)