0

I made below code for save some data to user table when taken a logout event, and now need to save same data to "login_histories" table for recording user log histories, then how to modify this function handle in below code? Thanks:)

timestamp_create_login_histories_table.php

public function up()
{
    Schema::create('login_histories', function (Blueprint $table) {
        $table->engine = 'InnoDB';            
        $table->increments('id')->unsigned();

        $table->integer('user_id')->unsigned()->index();
        $table->timestamp('last_login_at')->nullable();
        $table->string('last_login_ip')->nullable();
        $table->timestamps();
        $table->softDeletes();

        $table->foreign('user_id')->nullable()->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
    });
}

App\Listeners\LogSuccessfulLogin.php

namespace App\Listeners;

use Illuminate\Auth\Events\Login;
use Illuminate\Http\Request;

class LogSuccessfulLogin
{
    /**
     * Create the event listener.
     *
     * @param  Request  $request
     * @return void
     */
public function __construct(Request $request)
{
    $this->request = $request;
}

public function handle(Login $event)
{
    $user = $event->user;
    $user->last_login_at = date('Y-m-d H:i:s');
    $user->last_login_ip = $this->request->ip();
    $user->save();
}

Must make a model login_histories firstly? and then could I modify like below code?

public function handle(Login $event)
{
    $login_histories = $event->login_histories;
    $login_histories->last_login_at = date('Y-m-d H:i:s');
    $login_histories->last_login_ip = $this->request->ip();
    $login_histories->save();
}
JsWizard
  • 1,663
  • 3
  • 21
  • 48

1 Answers1

2

Create the model for login_histories table

LoginHistory.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\User;

class LoginHistory extends Model
{
    protected $table = 'login_histories';

    protected $guarded = [];

    public function user()
    {
         return $this->belongsTo(User::class);//use user classs
    }
}

Update App\Listeners\LogSuccessfulLogin.php something like this. can be done in many ways

save the login history not the user

namespace App\Listeners;

use Illuminate\Auth\Events\Login;
use Illuminate\Http\Request;
use App\LoginHistory;

class LogSuccessfulLogin
{
    /**
     * Create the event listener.
     *
     * @param  Request  $request
     * @return void
     */
public function __construct(Request $request)
{
    $this->request = $request;
}

public function handle(Login $event)
{
    LoginHistory::create([
        'user_id' => $event->user->id,
        'last_login_at' => date('Y-m-d H:i:s'),
        'last_login_ip' => $this->request->ip()
    ]);
}
aimme
  • 6,385
  • 7
  • 48
  • 65
  • I have adjust your code, but not save data both of user and login_histories table. thanks – JsWizard Oct 12 '17 at 21:35
  • 1
    thank you for your answer ;) I got the well working code. BTW I made Logout event also, so try to insert logout $event to 'deleted_at' for get the logout time. How could I get the logout data? – JsWizard Oct 12 '17 at 23:11
  • @Magnetic wc. Store something like session id in the login history to identify the session. Then later on you can find it by session id and delete it when the user logs out. if you want to fill deleted at on delete remember to make the model soft delete for it to work.good luck – aimme Oct 13 '17 at 08:51
  • thank you, your idea is very nice to management session. could you tell me more detailed information? have a nice weekend – JsWizard Oct 13 '17 at 09:06