【入門】 Laravelでログイン機能を実装する

こんにちは、むんです:grinning:
今回は、Laravelでログイン機能を実装してみたいと思います。
なんと、artisanコマンドで大体作ってくれるみたいです！
では初めて参りましょう。


### 目次
----

- ログイン機能を実装する
- 新規登録してみる
- ログインしてみる
- まとめ

---
#### 前提
- Laravelがインストール済みであること
- mysqlがインストール済みであること

Laravelのインストール手順は以下の記事に書いています。
:point_right_tone1:<a href="https://qiita.com/munchan0813/items/91c5ff45fa15a524cedc">【超初心者】LaravelでまずHelloworld</a>

#### 環境
- OS： macOS
- Laravelバージョン：　6.2.5
- phpバージョン：7.4.18


## ログイン機能を実装する
#### 1. プロジェクトを作成

```
// 最新バージョンのLaravelでプロジェクトを作成します。
$ composer create-project "laravel/laravel=6.*" loginlaravel

// プロジェクトディレクトリ配下へ移動
$ cd loginlaravel

// サーバーを起動する
$ php artisan serve --host 0.0.0.0
Starting Laravel development server: http://0.0.0.0:8000
[Wed May  5 11:31:21 2021] PHP 7.4.18 Development Server (http://0.0.0.0:8000) started

```
![laravel_v6_welcom画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/1ddd730d-9a59-040e-f965-fe6c5ed644af.png)
無事、 welcome画面の表示ができました！

#### 2. artisanコマンドでログイン機能を追加する

laravel/uiライブラリをインストール

```
$ composer require laravel/ui 1.*
```
ログイン機能を追加します。

```
$ php artisan ui vue --auth
Vue scaffolding installed successfully.
Please run "npm install && npm run dev" to compile your fresh scaffolding.
Authentication scaffolding generated successfully.
```
「Please run "npm install && npm run dev" to compile your fresh scaffolding.」に従います。

```
$ npm install
$ npm run dev
```
再度サーバーを起動して、確認します。

```
$ php artisan serve --host 0.0.0.0
```
![laravel_v6_welcom画面2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/e9197852-69c0-a352-16c8-30f1fbeb6cc2.png)
「LOGIN」ボタンと「REGISTER」ボタンが出来ていますね！

「LOGIN」ボタンを押下すると、ログイン画面に遷移します。
![laravel_認証画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/03c82aa8-0df0-f705-20d8-af63c25833c7.png)

「REGISTER」ボタンを押下すると、ユーザーの新規登録画面へ遷移します。
![laravel_新規登録画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/eb624056-2df4-b74a-6648-627624defb4e.png)


#### 3. マイグレーションする
続いて、マイグレーションでデータベースの設定をしていきます。
<details><summary>マイグレーションとは？</summary><div>
マイグレーション(migration)とは英語で「***移動・移行***」を意味します。
マイグレーションファイルというphpファイルにテーブル定義を書くことで、アプリケーションのソースコードと一緒に管理することが可能となります。
</br>
マイグレーションファイルを記述し終わった後で、Artisan migrateコマンドを実行すると、Laravelがその内容をもとに自動でデータベースを構成します。
</br>
その他にも、Laravelのマイグレーション機能にはシーダーやテスト用ダミーデータの自動生成など便利な機能がたくさんあるようですが、今回は割愛します。

</div></details>

**まず、マイグレーションファイルを作成します。**

```
$ php artisan make:migration create_users_table
//php artisan make:migration {ファイル名}

```
create_users_table部分はマイグレーションファイル名になります。
後で見返しても分かり易いファイル名にして下さい。

**そもそもmysqlに接続できるか確認してから進みましょう。**

```
$ mysql -u root -p
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```
接続失敗ですね。
これはmysql.sockがないことが原因で出るエラーです。
mysql.sockを作りましょう。

```
$ sudo touch /tmp/mysql.sock
```
mysqlを再起動します。

```
$ sudo mysql.server restart
 ERROR! MySQL server PID file could not be found!
Starting MySQL
.. ERROR! The server quit without updating PID file (/usr/local/var/mysql/{Username}s-MacBook-Pro.local.pid).

```
PIDファイルが見つかりませんよ！というエラー。
作りましょう。

```
$ touch /usr/local/var/mysql/{Username}s-MacBook-Pro.local.pid
$ sudo mysql.server restart
Starting MySQL
...... SUCCESS! 
```
接続成功です！:tada:

**データベースの一覧を確認します。**

```
$ mysql -u root -p
mysql> show databases;
```
恐らく、laravelというデータベースがないはずです。
それでは、作りましょう。

```
mysql> CREATE DATABASE laravel;
```

**再度マイグレートを実行してみます。**

```
$ 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)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)
```
成功です！:smile::tada:

<details><summary>別のdatabaseを指定したい場合</summary>
<div>
デフォルトでは"laravel"というdatabaseでテーブルが作成されますが、別のdatabaseを指定したい場合は.envファイルを修正して下さい。

```
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE={指定したいデータベース名に修正}
DB_USERNAME=root
DB_PASSWORD=
```

</div></details>
それではDBの設定が済んだので、ユーザーの登録、ログインができるはずです!

## 新規登録してみる
![新規登録_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/ef57e7ae-8591-3cc6-b1b1-888bfafed163.png)
Registerボタンを押下すると、下記画面に遷移するはずです。
![新規登録_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/88d99e3b-46ff-3ca6-990d-1921fdac8753.png)
ユーザーの登録に成功しました！:tada:

## ログインしてみる
一度ログアウトして、先ほど登録したユーザーでログインしてみます。
![ログイン_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/eee3b01b-cc39-3079-65ba-084aec8165bd.png)
Loginボタンを押下し、下記画面に遷移しログインに成功するはずです。

![ログイン_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183584/702cf636-b8a1-7dd4-bce7-75599b3e94c8.png)

ログインに成功しました！

<details><summary>mysqlでテーブルを確認してみましょう。</summary><div>

```
mysql> use  laravel;
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
mysql> show tables;
+-------------------+
| Tables_in_laravel |
+-------------------+
| failed_jobs       |
| migrations        |
| password_resets   |
| users             |
+-------------------+
4 rows in set (0.00 sec)

mysql> select * from users;
+----+----------+--------------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
| id | name     | email                    | email_verified_at | password                                                     | remember_token | created_at          | updated_at          |
+----+----------+--------------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
|  1 | testuser | {******}@gmail.com | NULL              | {暗号化されたパスワード} | NULL           | 2021-05-05 09:49:59 | 2021-05-05 09:49:59 |
+----+----------+--------------------------+-------------------+--------------------------------------------------------------+----------------+---------------------+---------------------+
1 row in set (0.00 sec)

mysql> 

```
</div></details>


## まとめ
いかがでしたでしょうか。
ログイン機能がこんなにサクッとできてしまうなんて、Laravelってすごいですね！
次回はログイン後の遷移先の実装をしてみたいと思います。