さて、「MacでLaravel5.8の開発環境を構築しよう」の開発編です。今回はLaravelのアプリを実際に作り、mysqlと紐づけるやり方について解説していこうと思います。まだ、下準備編を見られていない方はそちらから見てください。
#流れ
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に指定してアプリを作成するためのコードは下記の通りです。
$ composer create-project laravel/laravel=5.8 Laravel_app
↑バージョン指定 ↑アプリ名
ちょっと時間かかります。
Application key set successfully.
と言う文字が表示されたら終わってると思います。
これが表示されたら、Laravel_appに移動して、実際にLaravel5.8でインストールされているか確認してみましょう。
$ cd Laravel_app
$ php artisan -V
Laravel Framework 5.8.35
こんな風に表示されていたら、実際にローカルサーバを起動してみましょう。
$ php artisan serve
Laravel development server started: <http://127.0.0.1:8000>
ここに出てくるURLを貼り付けで検索してみましょう。そしたら、下のような画像が出てくるはずです。
次は止めてみましょう。ターミナル上でcontrol
+c
を押すとローカルサーバが終了します。URLを再読読み込みするとこうなります。
基本的にこのサーバは立てながら作業するのですが、サーバを立てている間その時使ったターミナルはコードを入力できなくなってしまいます。ですので、サーバを立てるターミナルとコードを打つ用のターミナルの2つを使って作業するのが効率いいです。
#2.mysqlのインストール
mysqlはよく使われているDBベースの1つです。mysqlは、homebrewでインストールすることができます。今回は最新版を使うので、バージョン指定はしません。
$ brew install mysql #@~ でバージョン指定
mysqlが入っているようであれば、下記のようになるはずです。
$ mysql -V
mysql Ver 8.0.18 for osx10.14 on x86_64 (Homebrew)
この段階では、まだmysqlが起動していないので、起動してみます。
うまく行ってればこうなります。
$ mysql.server start
Starting MySQL
.. SUCCESS!
次にrootユーザーでログインします。最初はパスワードついてないのでユーザー名だけでログインできます。
$ 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
を実行して、もう一度入力してみてください。大抵治ります。
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
現在rootユーザーにパスワードはついてないのですが、全権限をもつrootユーザーのパスワードが設定されてないのはまずいです。そこらへんのことやセキュリティ関連の設定は下記で説明されています。今回は飛ばします。
Macでmysqlの初期設定
#3.mysqlのデータベースを作成する
今回はLaravel_app
と接続するので、それ用のデータベースを作成します。データベース名はappdb
とでもしておきましょう。
mysql> create database appdb;
Query OK, 1 row affected (0.00 sec)
appdb
がちゃんと作られているか、データベースを確認しておきましょう。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| appdb |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.02 sec)
#4.ユーザーの作成
さて、laravelと紐づけるためには、ユーザーが必要です。rootユーザーでもいいのですが、rootユーザーは前記した通り全権限を持っているので、紐づける時には使いたくないです。そこで新たにユーザーを作成します。新たなユーザーはhuman
とでもしときましょうか。
mysql> create user human@localhost identified by 'パスワード';
↑ユーザー名 ↑ホスト名
Query OK, 0 rows affected (0.01 sec)
ユーザーが作成されているか確認しときましょう。
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ユーザーでログインした状態で行います。
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
になるので*
と書かないように注意しましょう。
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
が追加されているはずです。
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文)
mysql公式 ドキュメンテーション
#6.認証方法の変更
次にやっていくのは、ログイン認証方法の変更です。なんでこれが必要かというとmysql8.0からログイン認証方法が変わっているんですが、laravel5.8はそれに対応していないようです。そこで変更前の認証方法に戻しておく必要があります。
まず、現在どのような認証方法になっているのかを確認してみましょう。
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
で作成されます。
alter user human@localhost identified with mysql_native_password by 'パスワード';
Query OK, 0 rows affected (0.01 sec)
変更されているか確認しときましょう。
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
を起動しましょう。
$ cd Laravel_app
Laravel_app$ vim
起動したら、下記コードで.env
を開きます。
:e .env
開けたら下記のように編集します。編集するときはi
を押して入力モードにします。
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=appdb
DB_USERNAME=human
DB_PASSWORD=パスワード
編集が終わったらesc
を押してノーマルモードにしてZZ
で内容を保存し終了してください。
cat
を使って中身を確認して変更できているか確認してください。
$ cat .env
変更されていることを確認したら、次のコードでその設定を反映させます。
$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!
さて、最後です。Laravel5.8では作成した時から、user等のmigrationファイルが作成されています。migarationファイルは、データベースの設計図
のようなものです。このmigrationファイルを実行するとその中に書かれていたことが、データベースに反映されるわけです。というわけで、実際に反映させてみましょう。
$ 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ユーザーでログインします。その後データベースを移動します。
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
データベース内のテーブルをみてみましょう。3つのテーブルが作成されているはずです。
mysql> show tables;
+-----------------+
| Tables_in_appdb |
+-----------------+
| migrations |
| password_resets |
| users |
+-----------------+
3 rows in set (0.00 sec)
ここまでで開発環境の構築は完了です。
#参考にしたサイト
mysql公式ドキュメント
Laravel データベース接続編