laravel 5 中的登录事件处理

2022-08-30 23:51:00

我正在尝试挂接到登录名,即使在我的L5应用程序中设置上次登录时间和IP地址。我可以使它与以下内容一起工作:

Event::listen('auth.login', function($event)
{
    Auth::user()->last_login = new DateTime;
    Auth::user()->last_login_ip = Request::getClientIp();
    Auth::user()->save();
});

但是,我想知道在L5中执行此操作的最佳方法是使用事件处理程序对象。我尝试创建一个事件处理程序,并在事件服务提供程序中添加auth.login作为数组密钥,但这不起作用。我不确定这是否可能与auth.login事件一起发生。如果不是,哪里是放置上述代码的最合适位置。为了进行测试,我把它放在我的路由.php文件中,但我知道这不是它应该在的地方。


答案 1

在拉拉维尔5.2中;身份验证登录将不起作用...必须使用以下各项:

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

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

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

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

此处的文档所述


答案 2

编辑:这仅适用于5.0.*和5.1.*。

有关 5.2.* 解决方案,请参阅下面的 JuLiAnc 响应。

在处理了两个建议的答案以及更多的研究之后,我终于弄清楚了如何以我最初尝试的方式做到这一点。

我运行以下工匠命令

$ php artisan handler:event AuthLoginEventHandler

然后,我更改了生成的类,删除了 Event 类的导入,并导入了用户模型。我还传递了 and 到 handle 方法,因为当 auth.login 事件被触发时,这就是传递的内容。User $user$remember

<?php namespace App\Handlers\Events;

use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldBeQueued;
use App\User;

class AuthLoginEventHandler {

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

    /**
     * Handle the event.
     *
     * @param  User $user
     * @param  $remember
     * @return void
     */
    public function handle(User $user, $remember)
    {
        dd("login fired and handled by class with User instance and remember variable");
    }

}

现在我打开了事件服务提供.php并修改了数组,如下所示:$listen

protected $listen = [
    'auth.login' => [
        'App\Handlers\Events\AuthLoginEventHandler',
    ],
];

我意识到,如果一开始这不起作用,你可能需要

$ php artisan clear-compiled

我们开始吧!现在,我们可以使用事件处理程序类通过 auth.login 事件响应用户登录!


推荐