Edited at

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

More than 1 year has passed since last update.

001.png


親記事

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


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

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


ビューを修正する

生成したビューはほぼそのままで使えるのですが、レイアウトの指定などの細かな修正が必要です。

下記のリンク先の内容に丸ごと入れ替えてください。

:page_facing_up: resources/views/auth/


コントローラを修正する

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

ログインした後は/homeではなくトップページ(/)にリダイレクトするようにします。

下記のLoginコントローラだけでなく、RegisterResetPasswordVerificationコントローラでも同様に修正してください。


app/Http/Controllers/Auth/LoginController.php

-    protected $redirectTo = '/home';

+ protected $redirectTo = '/';

また、RedirectIfAuthenticatedミドルウェアも修正が必要です。

これを忘れてログインした状態で/loginへアクセスすると、/homeへリダイレクトしてしまいます。

:link: 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のコマンドでキャッシュを削除してみてください。

:link: キャッシュや古いデータを削除したい


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

:link: 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で固定して保存するようにしていました。

これを修正します。

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