Blog de Notícias

Registrar Acessos no Laravel

Registrar Acessos no Laravel

Registrar Acessos no Laravel

Essa é uma necessidade comum em muitas aplicações, registrar informações de acessos dos usuários.

É muito comum por falta de conhecimento dos recursos do Framework PHP Laravel desenvolvedores criarem inúmeras opções para resolver isso, porém sem saber que já existe este recurso disponível no Laravel.

Quando o usuário faz login, logout e etc o Laravel dispara alguns eventos que podem ser utilizados para tomar certas ações, como por exemplo registrar informações do acesso do usuário, como data e hora.

 
 

Criar Tabela de Acessos:

Primeiro passo é criar uma tabela que vai conter as informações que você deseja armazenar sobre o acesso do usuário.

Acesse o terminal e rode o comando para gerar o model Access e a migration correspondente:

1

php artisan make:model Models\\Access -m

Ao rodar este comando vai gerar o arquivo de model em app/Models/Access.php e o arquivo de migration correspondente em database/migrations/date_and_time_create_accesses_table.php

O próximo passo é definir a estrutura de nossa tabela, neste exemplo vamos armazenar informações do usuário (id) e data e hora (datetime). Crie a migration com essa estrutura:

1

2

3

4

5

6

7

8

9

public function up()

{

    Schema::create('accesses', function (Blueprint $table) {

        $table->increments('id');

        $table->integer('user_id')->unsigned();

        $table->foreign('user_id')->references('id')->on('users');

        $table->datetime('datetime');

    });

}

Agora que já definiu a estrutura basta criar a nova tabela:

1

php artisan migrate

 
 

Criar Relacionamentos:

Uma vez que já criou as tabelas, o próximo passo é definir o relacionamento entre a tabela users e accesses, para fazer isso vá no model User em app/User.php e crie o relacionamento de 1 para muitos (one to many):

1

2

3

4

5

public function accesses()

{

    // Não esqueça de usar a classe Access: use App\Models\Access;

    return $this->hasMany(Access::class);

}

Já podemos também no model de usuário criar o método que insere um novo acesso acesso, ou seja, que registra um novo acesso de usuário:

1

2

3

4

5

6

7

8

public function registerAccess()

{

    // Cadastra na tabela accesses um novo registro com as informações do usuário logado + data e hora

    return $this->accesses()->create([

        'user_id'   => $this->id,

        'datetime'  => date('YmdHis'),

    ]);

}

PS. Não pode esquecer de definir no model Access o $fillable com os campos que podem ser preenchidos:

1

protected $fillable = ['user_id', 'datetime'];

 
 

Criar o Listener Para Interceptar os Eventos:

Agora o próximo passo é criar a classe (Listerner) que vai fazer alguma ação quando o usuário fazer login.

Para isso crie a nova classe app/Listeners/UserEventSubscriber.php

Essa classe precisa ter 3 métodos, o primeiro é o onUserLogin() que vai fazer algo após o login, o outro é o onUserLogout() que vai fazer algo no logout do usuário, e por último o subscribe() que vai definir quando o evento for disparado qual método vai direcionar as requisições.

Veja como deve ficar a implementação da classe UserEventSubscriber:

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

36

37

38

39

40

41

42

43

namespace App\Listeners;

 

class UserEventSubscriber

{

    /**

     * Handle user login events.

     */

    public function onUserLogin($event)

    {

        // Registra o acesso do usuário logado

        auth()->user()->registerAccess();

    }

 

 

    /**

     * Handle user logout events.

     */

    public function onUserLogout($event)

    {

        // Se quiser implementar algo pós logout é neste estágio

        //dd($event);

    }

 

 

    /**

     * Register the listeners for the subscriber.

     *

     * @param  Illuminate\Events\Dispatcher  $events

     */

    public function subscribe($events)

    {

        $events->listen(

            'Illuminate\Auth\Events\Login',

            'App\Listeners\UserEventSubscriber@onUserLogin'

        );

 

        $events->listen(

            'Illuminate\Auth\Events\Logout',

            'App\Listeners\UserEventSubscriber@onUserLogout'

        );

    }

 

}

Agora que a classe está devidamente implementada o próximo passo é registrar o evento de Subscribers, para isso acesse a classe app/Providers/EventServiceProvider.php e informe em $subscribe a classe de Listener que acabamos de criar:

1

2

3

protected $subscribe = [

    'App\Listeners\UserEventSubscriber',

];

 

Feito isso pronto, agora sempre que usuário fizer login um novo registro será cadastrado na tabela accesses com as informações definidas.