Loading...
Laravel自作パッケージ

Authユーザーのメールアドレスを変更

Authユーザーのメールアドレスを変更依頼をし、変更確認メールのURLへ移動後メールアドレスを変更するパッケージを作ってみた。

laravel-email-reset

Travis branch composer version licence laravel version

インストール

composer:
composer require kaoken/laravel-email-reset

設定

config\app.php に以下のように追加:

    'providers' => [
        ...
        // 追加
        Kaoken\LaravelMailReset\MailResetServiceProvider::class
    ],

    'aliases' => [
        ...
        // 追加
        'MailReset' => Kaoken\LaravelMailReset\Facades\MailReset::class
    ],

config\auth.phpへ追加する例

'email_reset' => 'users',を追加する。
[
    ...
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
        // 追加
        'email_reset' => 'users',
    ],
    ...
]
  • modelは、ユーザーモデルクラス
  • email_resetは、Mailableで派生したクラスを必要に応じて変更すること。 確認メールを送るときに使用する。
  • tableは、このサービスで使用するテーブル名
  • expireは、登録後にX時間操作しない場合、変更メールアドレス候補が削除される時間
    'email_resets' => [
        'users' => [
            'model' => App\User::class,
            'email_reset' => Kaoken\LaravelMailReset\Mail\MailResetConfirmationToUser::class,
            'table' => 'mail_reset_users',
            'expire' => 1,
        ]
    ],

コマンドの実行

php artisan vendor:publish --tag=mail-reset
実行後、以下のディレクトリやファイルが追加される。
  • database
    • migrations
    • 2017_09_21_000001_create_mail_reset_users_table.php
  • resources
    • lang
    • en
      • mail_reset.php
    • ja
      • mail_reset.php
    • views
    • vendor
      • confirmation
      • mail
        • confirmation.blade.php
    • complete.blade.blade.php

マイグレーション

マイグレーションファイル2017_09_21_000001_create_mail_reset_users_table.phpは、必要に応じて 追加修正すること。
php artisan migrate

カーネルへ追加

app\Console\Kernel.phpscheduleメソッドへ追加する。
これは、メール変更後24時間過ぎたユーザーを削除するために使用する。
    protected function schedule(Schedule $schedule)
    {
        ...
        $schedule->call(function(){
            MailReset::broker('users')->deleteUserAndToken();
        )->hourly();
    }

メール

上記設定のコンフィグconfig\auth.phpの場合、 email_resetKaoken\LaravelMailReset\Mail\MailResetConfirmationToUser::classは、 メール変更時に確認メールとして使用する。テンプレートは、views\vendor\mail_reset\mail\confirmation.blade.php を使用している。アプリの仕様に合わせて変更すること。

コントローラー

メールアドレス変更の例
<?php
namespace App\Http\Controllers;
use Auth;
use MailReset;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Kaoken\LaravelMailReset\Controllers\MailResetUsers;

class MailResetController extends Controller
{  
    use MailResetUsers;
    /**
     * MailResetUsers トレイトで使用する 
     * @var string
     */
    protected $broker = 'users';

    /**
     * メールアドレス変更画面
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
     */
    public function getChangeMail()
    {
        // 各自で用意する
        return view('change_email');
    }

    /**
     * ユーザーのメールアドレスを変更する
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse|mixed
     */
    public function postChangeMail(Request $request)
    {
        $all = $request->only(['email']);
        $validator = Validator::make($all,[
            'email' => 'required|unique:users,email|max:255|email',
        ]);

        if ($validator->fails()) {
            return redirect('change_email')
                ->withErrors($validator)
                ->withInput();
        }

        switch ( $this->sendMailAddressChangeLink(Auth::guard('customer')->user()->id, $all['email']) ) {
            case MailReset::INVALID_USER:
                redirect('first_register')
                    ->withErrors(['mail_reset'=>'無効なユーザーです。']);
                break;
            case MailReset::SAME_EMAIL_EXIST:
                redirect('first_register')
                    ->withErrors(['mail_reset'=>'既に同じメールアドレスが存在します。']);
                break;
            case MailReset::INVALID_CONFIRMATION:
            default:
                redirect('first_register')
                    ->withErrors(['mail_reset'=>'予期せぬエラーが発生しました。']);
        }
        return redirect('change_email_ok');
    }
}
クラス内にuse MailResetUsers$brokerは、必ず記述すること。

ルート

上記コントローラより
Route::group([
        'middleware' => ['auth:user'],
    ],
    function(){
        Route::get('user/mail/reset', 'MailResetController@getChangeMail');
        Route::post('user/mail/reset', 'MailResetController@postChangeMail');
    }
);
Route::get('user/mail/reset/{id}/{email}/{token}', 'MailResetController@getChangeMailAddress');

イベント

vendor\kaoken\laravel-email-reset\src\Eventsディレクトリ内を参照!

ChangedMailAddressEvent

メールアドレスが完全に変更された後に呼び出される。

MailResetConfirmationEvent

メールアドレスの変更候補を保存後呼び出される。

ライセンス

MIT

コメントを残す

%d人のブロガーが「いいね」をつけました。