【Laravel5.8+Stripe③】ユーザー認証機能のカスタマイズ

f:id:nekorokkekun:20190827102831p:plain:w1000
こちらの連載記事では、LaravelとStripeを使用して企業サイト兼Eコマース(ECサイト)を作成していきます。

Laravelのプロジェクト作成からStripeの実装まで行い、最終的に単発決済・サブスクリプションの実装までを目指します。

シリーズ

【Laravel5.8+Stripe⓪】ECサイト作成チュートリアル概要 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe①】ベースプロジェクトの作成 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe②】メールフォームの実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe③】ユーザー認証機能のカスタマイズ - Laravelとねころっけくん5.8
【Laravel5.8+Stripe④】ディスカウントページを作成する - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑤】Laravel CasherとStripeを導入して管理者権限を設定する その1 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑥】Laravel CasherとStripeを導入して管理者権限を設定する その2 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑦】サブスクリプション決済の作成 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑧】請求書ダウンロード機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑨】サブスクリプションプラン変更機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑩】サブスクリプション中止機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe11】Webhookの実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe12】クーポン機能を実装する - Laravelとねころっけくん5.8
【Laravel5.8+Stripe13】ショッピングカートの実装 - Laravelとねころっけくん5.8


ちなみにこちらの記事は、Easy E-Commerce Using Laravel and Stripeという書籍をもとに執筆しています。


今回はLaravelの認証機能をサイトに導入していきます。

データベースの作成〜マイグレート

まずは以下の流れでデータベースの作成とmigrateを行いましょう。

.env

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ecommerce //変更
DB_USERNAME=root
DB_PASSWORD=

コマンドラインからMySQLへ以下のコマンドを入力

$ mysql -u root
$ create database ecommerce;

コマンドラインからmigrate

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.03 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.02 seconds)

認証機能の導入

次にLaravelネイティブな認証機能を導入していきます。

$ php artisan make:auth //Auth機能の導入
$ php artisan make:migration AddUserLocation --table=users // usersテーブルにカラムを足すmigrationファイルの作成

/database/migrations/2019_08_15_221247_add_user_location.phpに以下の行を追記

    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('address');
            $table->string('city');
            $table->string('state');
            $table->string('zip');
        });
    }
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn(['address', 'city', 'state', 'zip']);
        });
    }
$ php artisan migrate
Migrating: 2019_08_15_221247_add_user_location
Migrated:  2019_08_15_221247_add_user_location (0.01 seconds)


/resources/views/auth/register.blade.phpを開けると、ユーザー登録画面のbladeとなっているので、nameの入力Formの下(27行目あたり)に以下のコードを追記します。

                        <div class="form-group row">
                            <label for="address" class="col-md-4 col-form-label text-md-right">{{ __('Address') }}</label>

                            <div class="col-md-6">
                                <input id="address" type="text" class="form-control @error('address') is-invalid @enderror" name="address" value="{{ old('address') }}" required autocomplete="address" autofocus>

                                @error('address')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>
                        
                        <div class="form-group row">
                            <label for="city" class="col-md-4 col-form-label text-md-right">{{ __('City') }}</label>

                            <div class="col-md-6">
                                <input id="city" type="text" class="form-control @error('city') is-invalid @enderror" name="city" value="{{ old('city') }}" required autocomplete="city" autofocus>

                                @error('city')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>
                        
                        <div class="form-group row">
                            <label for="state" class="col-md-4 col-form-label text-md-right">{{ __('State') }}</label>

                            <div class="col-md-6">
                                <input id="state" type="text" class="form-control @error('state') is-invalid @enderror" name="state" value="{{ old('state') }}" required autocomplete="state" autofocus>

                                @error('state')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>
                        
                        <div class="form-group row">
                            <label for="zip" class="col-md-4 col-form-label text-md-right">{{ __('Zip') }}</label>

                            <div class="col-md-6">
                                <input id="zip" type="text" class="form-control @error('zip') is-invalid @enderror" name="zip" value="{{ old('zip') }}" required autocomplete="zip" autofocus>

                                @error('zip')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

/app/Http/Controllers/Auth/RegisterController.phpに以下を追記

    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
            'password' => ['required', 'string', 'min:8', 'confirmed'],
            'address' => 'required',  //追記
            'city' => 'required',  //追記
            'state' => 'required',  //追記
            'zip' => 'required',  //追記
        ]);
    }

    protected function create(array $data)
    {
        return User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => Hash::make($data['password']),
            'address' => $data['address'],  //追記
            'city' => $data['city'],  //追記
            'state' => $data['state'],  //追記
            'zip' => $data['zip'],  //追記
        ]);
    }
}

また、同じく
/app/Http/Controllers/Auth/RegisterController.php
/app/Http/Controllers/Auth/LoginController.php
/app/Http/Controllers/Auth/VerificationController.php
/app/Http/Controllers/Auth/ResetPasswordController.php
/app/Http/Controllers/Auth/RegisterController.php
/app/Http/Controllers/Auth/ForgotPasswordController.php

protected $redirectTo = '/home';
||>
を、
>|php|
protected $redirectTo = '/';
||>
に変更します。

そして、/app/Http/Middleware/RedirectIfAuthenticated.phpを以下のように変更します。
>|php|
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/'); //変更
        }

        return $next($request);
    }
||>

次に/app/User.phpに追記をします。
>|php|
    protected $fillable = [
        'name', 'email', 'password','address','city','state','zip'
    ];
||>

最後に/routes/web.phpを開き、以下の行を削除してください。
>|php|
Route::get('/home', 'HomeController@index')->name('home');
||>

ここで行なっているのは、各ユーザーの住所、市、州、および郵便番号などを認証時に入力できるようにすることです。

試しにAboutControllerに以下のコードを追加して、/aboutにアクセスしてみます。
>|php|
    public function __construct()
    {
        $this->middleware('auth');
    }
||>
以下のような画面が表示されるはずです。
[f:id:nekorokkekun:20190816073725p:plain]

試しにユーザー登録ができるか、そして登録後にwelcome.blade.phpに遷移されるか試してみましょう。

*ログアウト処理
余談ですがログアウト処理は以下のファイルが行なっています。
/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
>|php|
    public function logout(Request $request)
    {
        $this->guard()->logout();

        $request->session()->invalidate();

        return $this->loggedOut($request) ?: redirect('/');
    }

このメソッドは、すべてのセッションまたはCookieをクリアし、ユーザーをホームページにリダイレクトします。この機能は既に実装されているため、必要な作業は適切なルートを作成することだけです。

また、Laravelでユーザー認証機能(make:auth)の導入を行なった際に、自動的にパスワードリセット機能も導入されることになります。

/password/reset

でアクセスをすると/resources/views/auth/passwords/email.blade.phpが表示されます。

こちらをカスタムすることでパスワードリセット画面の外観を変えることもできます。

連載記事

【Laravel5.8+Stripe⓪】ECサイト作成チュートリアル概要 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe①】ベースプロジェクトの作成 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe②】メールフォームの実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe③】ユーザー認証機能のカスタマイズ - Laravelとねころっけくん5.8
【Laravel5.8+Stripe④】ディスカウントページを作成する - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑤】Laravel CasherとStripeを導入して管理者権限を設定する その1 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑥】Laravel CasherとStripeを導入して管理者権限を設定する その2 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑦】サブスクリプション決済の作成 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑧】請求書ダウンロード機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑨】サブスクリプションプラン変更機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe⑩】サブスクリプション中止機能の実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe11】Webhookの実装 - Laravelとねころっけくん5.8
【Laravel5.8+Stripe12】クーポン機能を実装する - Laravelとねころっけくん5.8
【Laravel5.8+Stripe13】ショッピングカートの実装 - Laravelとねころっけくん5.8