Laravel tiene una característica llamada Events que nos permite lanzar un evento y escucharlo a través de los Listeners. Nosotros para poner en práctica esta característica, escucharemos el evento login y guardaremos la fecha de login para saber cuanto hace de la última vez que un usuario se ha logueado.
Para hacer esto, me he basado en este artículo.
Primero de todo, tenemos que añadir el campo a la base de datos. Por tanto, tenemos que crear una migración:
1 |
php artisan make:migration add_last_login_to_users_table |
Añadimos este código:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class AddLastLoginToUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function(Blueprint $table) { $table->timestamp('last_login'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function(Blueprint $table) { $table->dropColumn('last_login'); }); } } |
Ejecutamos las migraciones:
1 |
php artisan migrate |
Ahora, tenemos que registrar el evento y su listener. Abrimos EventServiceProvider.php y en el array de $listen añadimos este código:
1 2 3 4 5 |
protected $listen = [ 'Illuminate\Auth\Events\Login' => [ 'App\Listeners\LastLogin', ], ]; |
Una vez hecho esto, ejecutamos el siguiente comando que lo que hará será crear tanto los events como los listeners que haya en el array.
1 |
php artisan event:generate |
El evento no se creará porque es nativo de Laravel, pero el listener sí. Lo podemos encontrar en app/Listeners :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<?php namespace App\Listeners; use Illuminate\Auth\Events\Login; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Carbon\Carbon; class LastLogin { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param Login $event * @return void */ public function handle(Login $event) { $user = $event->user; $user->last_login = Carbon::now(); $user->save(); } } |
La función handle accede al usuario enviado desde el evento (Login), añade la fecha de último login (que será la de ahora) al objeto y lo guarda en la base de datos.
Para mostrar el valor en la vista basta con poner esto:
1 |
{{ $user->last_login }} |
Si quieres darle formato, podemos hacerlo así:
1 |
{{ $user->last_login->diffForHumans() }} |
Y tendremos que añadir al modelo User.php ésto:
1 2 3 |
protected $dates = [ 'last_login' ]; |
En este post sólo hemos creado un listener (LastLogin) ya que el evento que utilizamos (Login) es nativo de Laravel, si quieres ver como se crea un evento personalizado puedes hacerlo en la documentación de Laravel, es muy simple.
-
– https://laravel.com/docs/5.4/events
– http://paulcracknell.com/79/laravel-event-handler-last-login/
Al momento de crear la columna con la migración manda un error que necesita un valor por default, agregue:
$table->timestamp(‘last_login’)->nullable();
y todo corrió perfecto.
Saludos