MacでLaravel5.8の開発環境を構築しよう（開発）

さて、「MacでLaravel5.8の開発環境を構築しよう」の開発編です。今回はLaravelのアプリを実際に作り、mysqlと紐づけるやり方について解説していこうと思います。まだ、[下準備編](https://qiita.com/kokage_nozomu/items/4b79c9a74fecb42768f6)を見られていない方はそちらから見てください。

#流れ
1.Laravelのアプリを作る
2.mysqlをインストール
3.mysqlのデータベースを作成
4.ユーザーを作成
5.ユーザーの権限を追加
6.ログイン機能の変更
7.Laravelアプリとの紐付け

#1.Laravelのアプリを作る
では、早速Laravelのアプリを作っていきましょう。Laravelのアプリを作るには、composerを使用します。ここで注意が必要なのですが、Laravelの最新バージョンはLaravel5.8ではありません。だからなんだよ！と思われるかもしれませんが、普通にLaravelのアプリを作ってしまうと、Laravelの最新バージョンが使用されてしまいます。そこで、Laravel5.8で作成するためにはバージョンを指定する必要性があります。Laravel5.8に指定してアプリを作成するためのコードは下記の通りです。

```console
$ composer create-project laravel/laravel=5.8 Laravel_app
                                          ↑バージョン指定　↑アプリ名
```

ちょっと時間かかります。

```console
Application key set successfully.
```

と言う文字が表示されたら終わってると思います。
これが表示されたら、Laravel_appに移動して、実際にLaravel5.8でインストールされているか確認してみましょう。

```console
$ cd Laravel_app
$ php artisan -V
Laravel Framework 5.8.35
```
こんな風に表示されていたら、実際にローカルサーバを起動してみましょう。

```console
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
```

ここに出てくるURLを貼り付けで検索してみましょう。そしたら、下のような画像が出てくるはずです。

<img width="1072" alt="スクリーンショット 2019-10-17 10.41.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486260/c0a6e402-c6d0-2346-a0a2-2968fddabc5b.png">

次は止めてみましょう。ターミナル上で`control`+`c`を押すとローカルサーバが終了します。URLを再読読み込みするとこうなります。

<img width="1072" alt="スクリーンショット 2019-10-17 10.44.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486260/5dca20b5-8782-310f-39e5-5cfc28290b6a.png">

基本的にこのサーバは立てながら作業するのですが、サーバを立てている間その時使ったターミナルはコードを入力できなくなってしまいます。ですので、サーバを立てるターミナルとコードを打つ用のターミナルの２つを使って作業するのが効率いいです。

#2.mysqlのインストール
mysqlはよく使われているDBベースの１つです。mysqlは、homebrewでインストールすることができます。今回は最新版を使うので、バージョン指定はしません。

```console
$ brew install mysql #@~ でバージョン指定
```

mysqlが入っているようであれば、下記のようになるはずです。

```console
$ mysql -V
mysql  Ver 8.0.18 for osx10.14 on x86_64 (Homebrew)
```

この段階では、まだmysqlが起動していないので、起動してみます。
うまく行ってればこうなります。

```console
$ mysql.server start
Starting MySQL
.. SUCCESS!
```

次にrootユーザーでログインします。最初はパスワードついてないのでユーザー名だけでログインできます。

```console
$ mysql -uroot

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.18 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```

もし、サーバーを起動せずに上のコードを打ってしまうと、こういうエラーになります。こう出たら、`$ mysql.server start`を実行して、もう一度入力してみてください。大抵治ります。

```console
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```

現在rootユーザーにパスワードはついてないのですが、全権限をもつrootユーザーのパスワードが設定されてないのはまずいです。そこらへんのことやセキュリティ関連の設定は下記で説明されています。今回は飛ばします。
[Macでmysqlの初期設定](https://qiita.com/hondy12345/items/4b9080a9c1fb5d2b46a3)

#3.mysqlのデータベースを作成する
今回は`Laravel_app`と接続するので、それ用のデータベースを作成します。データベース名は`appdb`とでもしておきましょう。

```console
mysql> create database appdb;
Query OK, 1 row affected (0.00 sec)
```

`appdb`がちゃんと作られているか、データベースを確認しておきましょう。

```console
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| appdb              |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.02 sec)
```

#4.ユーザーの作成

さて、laravelと紐づけるためには、ユーザーが必要です。rootユーザーでもいいのですが、rootユーザーは前記した通り全権限を持っているので、紐づける時には使いたくないです。そこで新たにユーザーを作成します。新たなユーザーは`human`とでもしときましょうか。

```console
mysql> create user human@localhost identified by 'パスワード';
              ↑ユーザー名　↑ホスト名
Query OK, 0 rows affected (0.01 sec)
```

ユーザーが作成されているか確認しときましょう。

```console
mysql> select user, host from mysql.user order by user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| human            | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
```

ここから少し、ユーザーの編集をします。具体的には`権限の追加`と`認証設定の変更`です。

#5.ユーザーの権限の追加
まず、`権限の追加`についてやっていきましょう。まず、先ほど作成した`human`というユーザーがどんな権限を持っているのか確認しましょう。
ちなみに確認はrootユーザーでログインした状態で行います。

```console
mysql> show grants for human@localhost;
+-------------------------------------------+
| Grants for human@localhost                |
+-------------------------------------------+
| GRANT USAGE ON *.* TO `human`@`localhost` |
+-------------------------------------------+
1 row in set (0.00 sec)
```

作成したばかりのユーザーは大抵こんな感じになります。形式的には`GRANT できること　ON データベース名.テーブル名　TO ユーザー名@ホスト名`となります。humanユーザーでは、`できること`の部分が`USAGE`となっています。`USAGE`とは`権限なし`と言う意味です。`データベース名`　`テーブル名`のところは`*`になっています。`*`は`全て`と言う意味です。

これらのことを読み解いて、日本語にすると`humanユーザーは全てのデータベースとテーブルに対して権限を持たない`と言うことになります。つまり、ただ、ログインできるようになったけど、何もできないユーザーです。このままだと使い物にならないので、権限を追加してあげましょう。

権限の追加は簡単で、先ほど表示された形式通りに与えたい権限とその範囲を指定して実行すればいいだけです。
今回は`appdb`と言うデータベースに対して、`全ての権限`を与えたいので、下記のようになります。`できること`の部分では`全て＝all`になるので`*`と書かないように注意しましょう。

```console
mysql> grant all on appdb.* to human@localhost;
Query OK, 0 rows affected, 1 warning (0.01 sec)
```

もう一度ユーザーの権限を確認すると`grant all on appdb.* to human@localhost`が追加されているはずです。

```console
mysql> show grants for human@localhost;
+----------------------------------------------------------+
| Grants for human@localhost                               |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO `human`@`localhost`                |
| GRANT ALL PRIVILEGES ON `appdb`.* TO `human`@`localhost` |
+----------------------------------------------------------+
2 rows in set (0.00 sec)
```

より細かい権限の追加を行いたい場合は、下記を参考にしてください。
[ユーザーに権限を設定する(GRANT文)](https://www.dbonline.jp/mysql/user/index6.html)
[mysql公式 ドキュメンテーション](https://dev.mysql.com/doc/refman/8.0/en/grant.html)

#6.認証方法の変更
次にやっていくのは、ログイン認証方法の変更です。なんでこれが必要かというとmysql8.0からログイン認証方法が変わっているんですが、laravel5.8はそれに対応していないようです。そこで変更前の認証方法に戻しておく必要があります。

まず、現在どのような認証方法になっているのかを確認してみましょう。

```console
mysql> select user, host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | 127.0.0.1 | caching_sha2_password |
| human            | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)
```

pluginの部分が全部`caching_sha2_password`になっているのがわかると思います。何も設定してないと自動的にこれになります。これはlaravel5.8では対応してないものなので、`mysql_native_password`に変えていきます。あくまで、laravel5.8が対応していないというだけなので、変更する必要があるのはlaravelと接続するときに使用する`human`ユーザーだけです。

変更は下記コードでできます。これをするとそれ以降作成するユーザーも`mysql_native_password`で作成されます。

```console
alter user human@localhost identified with mysql_native_password by 'パスワード';
Query OK, 0 rows affected (0.01 sec)
```
変更されているか確認しときましょう。

```console
mysql> select user, host, plugin from mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | 127.0.0.1 | caching_sha2_password |
| human            | localhost | mysql_native_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)
```

とりあえず、mysqlでの作業はここまでで終了です。`\q`を入力して`Enter`押せばmysqlからログアウトできます。ちなみに`\`は`option`+`¥`で入力できます。

#7.Laravelとの紐付け
最後に、laravelとの紐付けをしていきます。具体的にやることは`.env`ファイルの編集です。`.env`とは環境設定と言われる部分でデータベースの情報を設定しとかないと、うまくいきません。というわけで編集していきます。勘がいい方は気づかれているかもしれないですが、`.env`は下準備編のとき作成した`.bashrc`と同じように隠しファイルです。そこで今回も`vim`で編集していきます。

`.env`は、作成したlaravelのアプリ内にあるので、まず移動しましょう。そのあと、`vim`を起動しましょう。

```console
$ cd Laravel_app
Laravel_app$ vim
```

起動したら、下記コードで`.env`を開きます。

```
:e .env
```

開けたら下記のように編集します。編集するときは`i`を押して入力モードにします。

```console
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=appdb
DB_USERNAME=human
DB_PASSWORD=パスワード
```

編集が終わったら`esc`を押してノーマルモードにして`ZZ`で内容を保存し終了してください。

`cat`を使って中身を確認して変更できているか確認してください。

```console
$ cat .env
```

変更されていることを確認したら、次のコードでその設定を反映させます。

```console
$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!
```

さて、最後です。Laravel5.8では作成した時から、user等のmigrationファイルが作成されています。migarationファイルは、`データベースの設計図`のようなものです。このmigrationファイルを実行するとその中に書かれていたことが、データベースに反映されるわけです。というわけで、実際に反映させてみましょう。

```console
$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.01 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.01 seconds)
```

これでデータが作成されました。もし、ここでエラーが出るなら、データベースの接続がうまくいっていません。一度Macを再起動したり、mysqlにhumanユーザーでログインできるか確かめてみてください。ちなみに自分がやった時もパスワードまちがてて、最初うまくいかなかった(^_^;)

作成できたら、念のためにデータベースを確認しておきましょう。まず、rootユーザーでログインします。その後データベースを移動します。

```console
mysql> use appdb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
```

データベース内のテーブルをみてみましょう。３つのテーブルが作成されているはずです。

```console
mysql> show tables;
+-----------------+
| Tables_in_appdb |
+-----------------+
| migrations      |
| password_resets |
| users           |
+-----------------+
3 rows in set (0.00 sec)
```

ここまでで開発環境の構築は完了です。

#参考にしたサイト
[mysql公式ドキュメント](https://dev.mysql.com/doc/refman/8.0/en/)
[Laravel データベース接続編](https://hirona-bys.hatenablog.com/entry/2019/02/05/152610)