Laravel - 上次登录日期和时间时间戳

jon*_*tyo 35 php laravel laravel-4

我知道有自动插入的字段(例如updated_atcreated_at)但我想知道是否有类似Eloquent 方法的时间戳()或Laravel方式来生成时间戳?

例如,我希望每次用户登录系统并将其存储到数据库时记录时间戳,这样我们就可以看到每个用户的上次登录日期和时间详细信息.

Dan*_*n H 71

在Laravel 5.2+(也在5.6上测试)过程略有不同.首先,将您的监听器添加到EventServiceProvider:

protected $listen = [
    'Illuminate\Auth\Events\Login' => [
        'App\Listeners\LogSuccessfulLogin',
    ],
];
Run Code Online (Sandbox Code Playgroud)

然后做:

php artisan event:generate
Run Code Online (Sandbox Code Playgroud)

这将在app/Listeners中创建一个新的监听器.现在编辑您的Listener以触摸users表中last_login列中的日期:

public function handle(Login $event)
{
    $event->user->last_login = date('Y-m-d H:i:s');
    $event->user->save();
}
Run Code Online (Sandbox Code Playgroud)

确保Artisan创建的监听器在顶部具有正确的命名空间.对于这种特殊情况,监听器中的正确名称空间应为:

use Illuminate\Auth\Events\Login;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
Run Code Online (Sandbox Code Playgroud)

  • 登录事件已存在。它位于此处:Illuminate\Auth\Events\Login,每当您向 Illuminate\Auth\Events\Login 添加侦听器时,它都会传递到您的方法。这一切都是自动发生的。 (2认同)
  • 仅供参考,仅当您需要与队列进行交互(`delete`、`release` 等)时才需要`InteractsWithQueue`,在这种情况下不需要。 (2认同)

Jef*_*ert 28

您可以观察auth.login事件并更新用户的上次登录时间.请参阅文档中的第一个示例,了解要完成您要执行的操作的事件.

Event::listen('auth.login', function($user) {
    $user->last_login = new DateTime;

    $user->save();
});
Run Code Online (Sandbox Code Playgroud)

注意:在4.0中,事件名称为user.login.在4.1中,事件名称是auth.login

更新

这取决于你放置事件监听器的位置.如果您阅读链接到doc页面,它会指出:

所以,你知道如何注册事件,但你可能想知道在哪里注册它们.别担心,这是一个常见的问题.不幸的是,这是一个很难回答的问题,因为你几乎可以在任何地方注册活动!但是,这里有一些提示.同样,与大多数其他引导代码一样,您可以在一个启动文件中注册事件,例如app/start/global.php.

如果您的启动文件过于拥挤,您可以创建一个单独的app/events.php文件,该文件包含在启动文件中.这是一个简单的解决方案,可以使您的事件注册与其他引导保持完全分离.如果您更喜欢基于类的方法,则可以在服务提供商中注册您的活动.由于这些方法都不具备"正确",因此请根据应用程序的大小选择您认为合适的方法.

我个人的偏好是在服务提供商中注册它们,因为这会使它们被隔离,而对我而言,更像是"Laravel"的做事方式.如果您需要有关服务提供商的帮助,请参阅文档条目.

但是,如果你真的想要尽可能快地获得并运行,那么你可以很容易地注册那个监听器. app/start/global.php


jor*_*jor 12

我有一个类似的问题.如果您认为不需要使用事件,则可以在对用户进行身份验证后更新时间戳.我将以下代码放在我的控制器方法中,该方法处理用户身份验证.

if (Auth::attempt(array('email'=>$email, 'password'=>$password))) {
    Auth::user()->last_login = new DateTime();
    Auth::user()->save();
    return Redirect::intended('/');
} else {
    return Redirect::to('account/login');
}
Run Code Online (Sandbox Code Playgroud)

这对我来说很重要.

  • 我认为在这个解决方案中你会错过自动登录机制的登录. (9认同)

Raf*_*ier 12

只需将以下代码添加到App\Http\Controllers\Auth\LoginController.php即可

在控制器的顶部:

use Carbon\Carbon;
use Illuminate\Http\Request;
Run Code Online (Sandbox Code Playgroud)

在你的控制器里面放下这个功能:

public function authenticated(Request $request, $user) {
    $user->last_login = Carbon::now()->toDateTimeString();
    $user->save();
}
Run Code Online (Sandbox Code Playgroud)