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


親記事

Laravel 5.7で基本的なCRUDを作る - Qiita

認証の機能を一括して導入する

readouble.com: 認証

以前の記事で下記を既に実行している場合は不要です。

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内にルートを追加

ビューを修正する

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

resources/views/auth/

コントローラを修正する

readouble.com: パスのカスタマイズ

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

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

また、RedirectIfAuthenticatedミドルウェアも修正が必要です。
これを忘れてログインした状態で/loginへアクセスすると、/homeへリダイレクトしてしまいます。
404.blade.php page user logged in issue

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

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

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

記事の投稿、編集、削除は認証を必須とする

readouble.com: コントローラーミドルウェア

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

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

これで、ログアウトした状態でNew Postをクリックすると、記事の投稿の前にまずはログインするように促されます。
002.png

記事作成時に著者のIDを保存する

以前の記事でpostsとusersテーブルを関連させた時は、ログイン機能がなかったので著者のIDを1で固定して保存するようにしていました。
これを修正します。
readouble.com: 認証済みユーザーの取得

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);
     }