ログインされたときやログインに失敗したときに任意の処理を実行する方法を紹介します。ショートメッセージやメールでログインを通知したり、ログを残したりすることができます。
イベントを活用しよう
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 | パスワードリセットが行われたとき |
例えば、下のようにしておくと、ユーザーが登録されたとき(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では便利な数多くのイベントが用意されていますので、目的にあったイベントを活用しましょう。
コメント