【Laravel】ログインされたときに任意の処理を実行するには?

laravel Laravel

ログインされたときやログインに失敗したときに任意の処理を実行する方法を紹介します。ショートメッセージやメールでログインを通知したり、ログを残したりすることができます。

Laravel 6での方法を紹介します。

スポンサーリンク

イベントを活用しよう

Laravelにはイベントという機能が搭載されています。

イベントを活用することにより、ログインやログアウトなどといった特定の処理が発生したときに任意のプログラムを実行することができるようになります。

イベントリスナ(イベントが発生したときに行う処理を定義しておくファイル)をあらかじめ作成しておくことで、ログインされたときに任意の処理を実行できます。

スポンサーリンク

イベントを作成する

まずは、app\Providers\EventServiceProvider.phpを開き、イベントハンドラを定義します。

ここではAuthで利用できるすべてのイベントを定義してみます。

/**
 * アプリケーションに指定されたイベントリスナ
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Auth\Events\Registered' => [
        'App\Listeners\LogRegisteredUser',
    ],

    'Illuminate\Auth\Events\Attempting' => [
        'App\Listeners\LogAuthenticationAttempt',
    ],

    'Illuminate\Auth\Events\Authenticated' => [
        'App\Listeners\LogAuthenticated',
    ],

    'Illuminate\Auth\Events\Login' => [
        'App\Listeners\LogSuccessfulLogin',
    ],

    'Illuminate\Auth\Events\Failed' => [
        'App\Listeners\LogFailedLogin',
    ],

    'Illuminate\Auth\Events\Logout' => [
        'App\Listeners\LogSuccessfulLogout',
    ],

    'Illuminate\Auth\Events\Lockout' => [
        'App\Listeners\LogLockout',
    ],

    'Illuminate\Auth\Events\PasswordReset' => [
        'App\Listeners\LogPasswordReset',
    ],
];

認証に関するイベントの種類についてはこちらの表のようになります。

イベント実行されるタイミング
 Illuminate\Auth\Events\Registeredユーザーが登録されたとき
 Illuminate\Auth\Events\Attempting認証が行われたとき
 Illuminate\Auth\Events\Authenticated認証が成功したとき
(ログインページでログイン成功したとき+ログイン済みで自動的に認証されたときも発火)
 Illuminate\Auth\Events\Loginログインされたとき
(ログインページでログイン成功したときのみ発火)
 Illuminate\Auth\Events\Failedログインに失敗したとき
 Illuminate\Auth\Events\Logoutログアウトされたとき
 Illuminate\Auth\Events\PasswordResetパスワードリセットが行われたとき
Laravel 認証イベントの種類

例えば、下のようにしておくと、ユーザーが登録されたとき(Illuminate\Auth\Events\Registered)にイベントが発火し、イベントリスナ(App\Listeners\LogRegisteredUser)が実行されます。

    'Illuminate\Auth\Events\Registered' => [
        'App\Listeners\LogRegisteredUser',
    ],

同様に、ログインされたときに処理を行いたいときはIlluminate\Auth\Events\Loginイベントを定義してやればOKです。イベントの種類はLaravelのドキュメントに記載されています。

なお、実行されるイベントリスナのファイルは次の手順で自動生成させますので、手動で作成する必要はありません。

イベントリスナを作成する

上記のファイルで定義したイベントリスナを作成します。artisanコマンドで作成できます。

php artisan event:generate

App\Listenersディレクトリが作成され、EventServiceProvider.phpで定義したイベントリスナが作成されます。

後からイベントを追加した場合も同様にコマンドを実行します。

存在しないイベントリスナが自動的に追加されます。

処理を実装する

App\Listenersディレクトリに作成されたファイル群を編集することで、実行したい処理を実装することができます。

ここでは、app\Listeners\LogSuccessfulLogin.phpに処理を追加し、ログインに成功したときにログに記録するようにしてみます。

<?php

namespace App\Listeners;

use App\Http\Controllers\LineNotifyCon;
use Illuminate\Auth\Events\Login;
use Illuminate\Support\Facades\Log;

class LogSuccessfulLogin
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  Login  $event
     * @return void
     */
    public function handle(Login $event)
    {

        //ログインされたらログ(storage/log/laravel.log)に残す
        Log::info("Login");
        Log::info($event->user);
    }
}

これでログインされたときに自動的にログが記録されるようになりました。

まとめ

ログインされたときに任意の処理を実行する方法を紹介しました。

Laravelでは便利な数多くのイベントが用意されていますので、目的にあったイベントを活用しましょう。

コメント

タイトルとURLをコピーしました