Logging Activity With Laravel and Pusher
Tags: laravel, security, php, firstpost
Published: 2019-03-14 14:11:39

---
title: Logging Activity With Laravel and Pusher
published: true
description: Logging users activity for analytics and records.
tags: laravel, security, php, firstpost
---
![LaravelEliteSquad](https://thepracticaldev.s3.amazonaws.com/i/65tizs3gdh7w5tdi1tid.png)

Logging activity is important for many reasons, I am not big on relying on packages and everyone and their brothers has a package for logging activity when it just isnt needed.

I am assuming you have laravel installed already writing this. If not, or you are not sure what Laravel is, head over to www.laravel.com and take a gander.

Before we can start, we need to require and install Pushers PHP SDK (https://pusher.com) which can be found at https://github.com/pusher/pusher-http-laravel

## Installation

Require this package, with composer (https://getcomposer.org/), in the root directory of your project.

```bash
$ composer require pusher/pusher-http-laravel
```

Add the service provider to `config/app.php` in the `providers` array. If you're using Laravel 5.5 or greater, there's no need to do this.

```php
Pusher\Laravel\PusherServiceProvider::class
```

If you want you can use the [facade](http://laravel.com/docs/facades). Add the reference in `config/app.php` to your aliases array.

```php
'Pusher' => Pusher\Laravel\Facades\Pusher::class
```

## Configuration

Laravel Pusher requires connection configuration. To get started, you'll need to publish all vendor assets:

```bash
$ php artisan vendor:publish --provider="Pusher\Laravel\PusherServiceProvider"
```

This will create a `config/pusher.php` file in your app that you can modify to set your configuration. Also, make sure you check for changes to the original config file in this package between releases.

Finally to finish the Pusher portion head over to their website and grab your keys and place them into Laravel's `.env` file.

So to start, we need an event and model. So let us smash the following commands into our console.


```
php artisan make:event "LogActivity"
```

```
php artisan make:model "UserActivity" --migration
```

Now, lets set up the migration and model 

Open `App\UserActivity.php` and put the following in it.

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class UserActivity extends Model
{
    protected $table = 'user_activities';

    protected $fillable = [
      'user_id',
      'type',
      'description',
      'archived'
    ];
}
```
Open `App\database\migrations\TimeStamp_create_user_activities.php` and put the following in it.

```php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUserActivitiesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
     public function up()
    {
        Schema::create('user_activities', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id');
            $table->string('type');
            $table->longText('description');
            $table->boolean('archived')->default(false);
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('user_activities');
    }
}
```

Great, now we got our Model and Migration Setup, one last thing to do before we can start logging activity.

Open `App\Events\LogActivity.php` and put the following in it.
```php
<?php

namespace App\Events;

use App\User;
use App\UserActivity;
use Pusher\Laravel\Facades\Pusher;
use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;

class LogActivity
{
    use Dispatchable, SerializesModels;
    public $user;
    public $type;
    public $description;
    public function __construct($user, $type, $description)
    {
        $this->data = [
            'user'        => $user, 
            'type'        => $type,
            'description' => $description,
            'now'         => \Carbon\Carbon::now()->toDateTimeString()
        ];
        $this->storeActivity();
        $this->broadcast();
    }
    private function storeActivity(){
        return UserActivity::create([
            'user_id'     => $this->data['user']->id,
            'type'        => $this->data['type'],
            'description' => $this->data['description']
        ]);
    }
    public function broadcast()
    {
        $this->data['user'] = $this->data['user']->name;
        return Pusher::trigger('staff-dashboard', 'logActivity', ['data' =>   $this->data]);
    }
}
```

Just to break this event down some, `storeActivity()` is what performs the operation with the database and `broadcast()` is what relays the activity in real-time with Pusher to my admin dashboard, to create a real-time feed of the activity on my websites.

That it, your ready to start using it in action. Whenever you want to log activity you need to make sure you include the class by putting the following at the top of your controller.

```php
use App\Event\LogActivity;
```


Now to use it just drop the following:

```php
event(new LogActivity(Obj $user, String $type, String $description));
```

Here are some example use cases:


```php
event(new LogActivity($user, 'Log', $user->name . ' logged in.'));

event(new LogActivity($user, 'Alert', $user->name . ' has sent you a message.'));

event(new LogActivity($user, 'Security', $user->name . ' is probing route user.support.'));
```
I hope you enjoyed my first post on https://dev.to, let me know what you think or what you use, if it is similar to this.