Laravel5.7: ログイン機能を追加する

![001.png](https://qiita-image-store.s3.amazonaws.com/0/27816/0d2d8813-a20f-6362-9b25-9f1805770936.png)

# 親記事
[Laravel 5.7で基本的なCRUDを作る - Qiita](https://qiita.com/sutara79/items/ef30fcdfb7afcb2188ea)


# 認証の機能を一括して導入する
:link: readouble.com: [認証](https://readouble.com/laravel/5.7/ja/authentication.html)

[以前の記事](https://qiita.com/sutara79/items/3ae420f756573a4a2f93)で下記を既に実行している場合は不要です。

```text:PowerShell
> php artisan make:auth
```

上のコマンドで以下のことが起こります。

- `resources/views/home.blade.php`生成
- `resources/views/auth/`内に複数のビューを生成
- `resources/views/layouts/app.blade.php`生成
- `app/Http/Controllers/HomeController.php`生成
- `app/Http/Controllers/Auth/`内に複数のコントローラを生成
- `routes/web.php`内にルートを追加


# ビューを修正する
生成したビューはほぼそのままで使えるのですが、レイアウトの指定などの細かな修正が必要です。
下記のリンク先の内容に丸ごと入れ替えてください。

:page_facing_up: [resources/views/auth/](https://github.com/sutara79/demo-laravel-crud/tree/5.7/resources/views/auth)


# コントローラを修正する
:link: readouble.com: [パスのカスタマイズ](https://readouble.com/laravel/5.7/ja/authentication.html#included-authenticating)

ログインした後は`/home`ではなくトップページ(`/`)にリダイレクトするようにします。
下記の**Login**コントローラだけでなく、**Register**、**ResetPassword**、**Verification**コントローラでも同様に修正してください。

```diff:app/Http/Controllers/Auth/LoginController.php
-    protected $redirectTo = '/home';
+    protected $redirectTo = '/';
```

また、RedirectIfAuthenticatedミドルウェアも修正が必要です。
これを忘れてログインした状態で`/login`へアクセスすると、`/home`へリダイレクトしてしまいます。
:link: [404.blade.php page user logged in issue](https://laracasts.com/discuss/channels/laravel/404bladephp-page-user-logged-in-issue)

```diff:app/Http/Middleware/RedirectIfAuthenticated.php
         if (Auth::guard($guard)->check()) {
-            return redirect('/home');
+            return redirect('/');
         }
```

以上で、ユーザー登録とログイン・ログアウトができるようになりました。
ユーザー登録で入力したメールアドレスへの確認用のメール送信や、パスワード再設定用のメール送信はまだできません。

なお、レイアウトに`my.blade.php`を指定しているはずなのにヘッダーが黒くならない場合は、`php artisan view:clear`のコマンドでキャッシュを削除してみてください。
:link: [キャッシュや古いデータを削除したい](https://qiita.com/sutara79/items/6a31f6aa070a4f410d7a)


# 記事の投稿、編集、削除は認証を必須とする
:link: readouble.com: [コントローラーミドルウェア](https://readouble.com/laravel/5.7/ja/controllers.html#controller-middleware)

**UserController**と**PostController**に`__construct()`メソッドを追加します。
ログインしなくても閲覧だけはできるように、`except()`で指定します。

```php:UserとPostコントローラ
class PostController extends Controller
{
    /**
     * 各アクションの前に実行させるミドルウェア
     */
    public function __construct()
    {
        $this->middleware('auth')->except(['index', 'show']);
    }
```

これで、ログアウトした状態で`New Post`をクリックすると、記事の投稿の前にまずはログインするように促されます。
![002.png](https://qiita-image-store.s3.amazonaws.com/0/27816/7db68b3d-6e4b-12bf-201f-98c927614a4c.png)


# 記事作成時に著者のIDを保存する
[以前の記事](https://qiita.com/sutara79/items/9e57e7af03b65e0d6047)でpostsとusersテーブルを関連させた時は、ログイン機能がなかったので著者のIDを1で固定して保存するようにしていました。
これを修正します。
:link: readouble.com: [認証済みユーザーの取得](https://readouble.com/laravel/5.7/ja/authentication.html#retrieving-the-authenticated-user)

```diff:app/Http/Controllers/PostController.php
     public function store(StorePost $request)
     {
         $post = new Post;
         $post->title = $request->title;
         $post->body = $request->body;
+        $post->user_id = $request->user()->id;
         $post->save();
         return redirect('posts/'.$post->id);
     }
```