awssat / laravel-visits by if4lcon

Laravel Redis visits counter for Eloquent models
118,783
921
21
Package Data
Maintainer Username: if4lcon
Maintainer Contact: bderemail@gmail.com (Bader Almutairi)
Package Create Date: 2017-09-13
Package Last Update: 2024-03-01
Home Page: https://awssat.com/opensource
Language: PHP
License: MIT
Last Refreshed: 2024-03-27 03:02:55
Package Statistics
Total Downloads: 118,783
Monthly Downloads: 2,102
Daily Downloads: 115
Total Stars: 921
Total Watchers: 21
Total Forks: 88
Total Open Issues: 5

Laravel Visits

aravel-visits

Latest Version on Packagist Software License Build Status Quality Score Total Downloads

Introduction

Laravel Visits is a counter that can be attached to any model to track its visits with useful features like IP-protection and lists caching

Table of Contents

Features

  • A model item can has many type of recorded visits (using tags).
  • It's not limitd to one type of Model (like some packages that allow only User model).
  • Record per visitors and not by vistis using IP detecting, so even with refresh visit won't duplicate (can be changed from config).
  • Get Top/Lowest visits per a model.
  • Get most visited countries ...
  • Get visits per a period of time like a month of a year of an item or model.

Install

Via Composer

composer require awssat/laravel-visits

Requirement

Before Laravel 5.5

In Laravel 5.4. you'll manually need to register the awssat\Visits\VisitsServiceProvider::class service provider in config/app.php.

Config

To adjust the library, you can publish the config file to your project using:

php artisan vendor:publish --provider="awssat\Visits\VisitsServiceProvider"

Upgrade to 1.4.0 from 1.3.*

  • Prfiex updated from bareq to visits if you missing your data try to revert prefex value to bareq

Note : Redis Database Name

  • By default laravel-visits doesn't use the default laravel redis configuration (see issue #5)

To prvent your data loss add a new conection on config/database.php


        'laravel-visits' => [
            'host' => env('REDIS_HOST', '127.0.0.1'),
            'password' => env('REDIS_PASSWORD', null),
            'port' => env('REDIS_PORT', 6379),
            'database' => 3, // anything from 1 to 15, except 0 (or what is set in default)
        ],

and you can define your redis connection name on config/visits.php


'connection' => 'default'

Usage

It's simple. Using visits helper as:

visits($model)->{method}()

Where:

  • $model: is any Eloquent model from your project.
  • {method}: any method that is supported by this library, and they are documented below.

Tags

  • You can track multiple kinds of visits to a single model using the tags as visits($model, 'tag1')->increment()

Increments and Decrements

Increment

One
visits($post)->increment();
More than one
visits($post)->increment(10);

Decrement

One
visits($post)->decrement();
More than one
visits($post)->decrement(10);

Only increment/decrement once during x seconds (based on visitor's IP)

visits($post)->seconds(30)->increment()
  • Note: this will override default config setting (once each 15 minutes per IP).

Force increment/decrement

visits($post)->forceIncrement();
visits($post)->forceDecrement();
  • This will ignore IP limitation and increment/decrement every visit.

An item visits

All visits of an item

visits($post)->count();
  • Note: $post is a row of a model, i.e. $post = Post::find(22)

Item's visits by a period

visits($post)->period('day')->count();

A model class visits

All visits of a model type

visits('App\Post')->count()

Visits of a model type in period

visits('App\Post')->period('day')->count()

Countries of visitors

visits($post)->countries()

Referers of visitors

visits($post)->refs()

Top or Lowest list per model type

Top/Lowest 10

visits('App\Post')->top(10)
visits('App\Post')->low(10)

Uncached list

visits('App\Post')->fresh()->top(10)
  • Note: you can always get uncached list by enabling alwaysFresh from package config.

By a period of time

visits('App\Post')->period('month')->top(10)

Reset and clear values

Clear an item visits

visits($post)->reset();

Clear an item visits of specific period

visits($post)->period('year')->reset()

Clear recorded visitors' IPs

visits($post)->reset('ips');
visits($post)->reset('ips', '127.0.0.1');

Periods options

  • minute
  • hour
  • xhours [1hours ... to 12hours]
  • day
  • week
  • month
  • year
  • quarter
  • decade
  • century

you also can make your custom period by adding a carbon marco in appserviceprovider:

Carbon::macro('endOf...', function () {
    //
});

Other

//clear all visits of the given model and its items
visits('App\Post')->reset()
//clear all cache of the top/lowest list
visits('App\Post')->reset('lists')
//clear visits from all items of the given model in a period
visits('App\Post')->period('year')->reset() 
//...?
visits('App\Post')->reset('factory')

Integration with Eloquent

You can add a visits method to your model class:

    public function visits()
    {
        return visits($this);
    }

Then you can use it as:

    $post = Post::find(1);
    $post->visits()->increment();
    $post->visits()->count();

Change log

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING and CODE_OF_CONDUCT for details.

Credits

License

The MIT License (MIT). Please see License File for more information.