Laravelでサクッとログイン機能を実装する方法

こんにちは!むちょこです。
PHPが大好きな人です。

昨今のLaravel人気はすごいですね。やっぱりみんなフルスタックフレームワークが好きなのかなー

今日はLaravelでログイン機能を作る方法をご紹介します☆
覚えておくとサクッとできるので、開発スピードがめちゃあがりますよ!

前提

今回の環境はこちら。

Apache 2.4.6 (CentOS)
PHP 7.1.14
MariaDB 5.5.52
Laravel 5.6

既にLaravelがインストールされていて、DBの設定が完了している状態から始めます。
(※本筋とずれるので詳しくは割愛しますが、DBの都合上こちらの処理を施してあります。https://laravel-news.com/laravel-5-4-key-too-long-error)

現在は、この画面が表示されています。

artisanコマンドで基本機能をサクッと生成

それでは早速作っていきましょう!

MEMO
公式マニュアルはこちら。
https://readouble.com/laravel/5.6/ja/authentication.html

Laravelのプロジェクトディレクトリで、以下のコマンドを実行します。

コマンド
$ php artisan make:auth
Authentication scaffolding generated successfully.

はい!これでアカウント認証に必要なファイルが生成されました。お手軽ですね~♪
具体的にはこんな機能が用意されています。

  • 登録
  • ログイン
  • パスワードリセット

よく見るとホーム画面の右上にも登録とログイン用のリンクが追加されています。

/login

/register

/password/reset

次はDBの準備をしましょう。
これもコマンドを実行するだけです。

コマンド
$ php artisan migrate
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table

DBにusersテーブルとpassword_resetsテーブルが追加され、ログイン機能が使えるようになりました。

登録やログインが成功すると、/homeにリダイレクトされます。

/home

ログイン必須ページを追加する

さて、前章で基本的な機能は準備できました。
しかしログイン必須ページが/homeだけというサイトはあまりありませんよね。
もう1ページ追加してみましょう。

コントローラもartisanコマンドで生成できます。
今回はSNSチックにFriendControllerを作ってみました。

コマンド
$ php artisan make:controller FriendController
Controller created successfully.

コマンドが成功すると、app/Http/Controllersに以下のファイルが生成されます。

FriendController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FriendController extends Controller
{
    //
}

同クラス内にそれっぽいメソッドを作りましょう。

FriendController.php
   /**
     * 友人一覧
     * @return void
     */
    public function index()
    {
        return view('friend/index');
    }

/resources/views/friend/下に対応するviewも作ります。

index.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">友人一覧</div>

                <div class="card-body">
                    まだ友人はいません。
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

最後にルーティング設定です。

routes/web.php
Route::get('/friends', 'FriendController@index');

これで/friendsにアクセスできるようになりました!

しかし画像の右上を見ると分かる通り、今は未ログインの状態からでも同ページにアクセスができてしまいます。このページはログイン必須にしたいので、未ログインユーザはログインページに強制リダイレクトされるように変更していきましょう。

方法はいくつかあります。
1.コントローラのコンストラクタで設定する。

FriendController.php
    /**
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

コンストラクタで設定すると、FriendControllerの全メソッドをログイン必須にすることができます。1行で設定できて楽ちんですね♪
これで未ログイン状態で/friendsにアクセスすると、/loginにリダイレクトされるようになりました☆

でももし、FriendController.phpにログイン不要のページも含まれていたら…?
友人検索ページを追加してみましょう。

FriendController.php
    /**
     * 友人検索
     * @return void
     */
    public function search()
    {
        return view('friend/search');
    }
friend/search.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header">友人検索</div>

                <div class="card-body">
                    
                </div>
            </div>
        </div>
    </div>
</div>
@endsection
web.php
Route::get('/friend/search', 'FriendController@search');

今のままだと、当然/friend/searchもログインページに飛ばされてしまいますね。
まずは先ほどのmiddleware実行をコメントアウトしてしまいましょう。

FriendController.php
    /**
     * @return void
     */
    public function __construct()
    {
        //$this->middleware('auth');
    }

2.ルーティングで個別に設定する
ログイン必須にしたいページのルート設定にmiddlewareを付けることで、個別にログインの要/不要を設定することができます。

web.php
Route::get('/friends', 'FriendController@index')->middleware('auth');

また、複数ある場合はこのようにまとめて書くこともできます。

web.php
Route::group(['middleware' => 'auth'], function () {
    Route::get('/friends', 'FriendController@index');
    Route::get('/friend/search', 'FriendController@search');
});
MEMO
他にも、コントローラのメソッド内で判別して個別の処理を実行する方法などもあります。ここでは一旦割愛しますが、リクエストがあれば書きます☆

というわけで…おめでとうございます!
これであなたもログインが必要なページを作れるようになりました!

2 Comments

現在コメントは受け付けておりません。