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.
- Features
- Install
- Usage
- Increments and Decrements
- An item visits
- A model class visits
- Countries of visitors
- Referers of visitors
- Top or Lowest list per model type
- Reset and clear values
- Integration with Eloquent
- Changelog
- Contributing
- Credits
- License
- A model item can have many types of recorded visits (using tags).
- It's not limited 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, refs, OSes, and languages.
- Get visits per a period of time like a month of a year of an item or model.
- Supports multiple data engines: Redis or database (any SQL engine that Eloquent supports).
To get started with Laravel Visits, use Composer to add the package to your project's dependencies:
composer require awssat/laravel-visits
- Laravel 5.5+
- PHP 7.2+
- Data engines options (can be configured from config/visits.php):
- Redis: make sure that Redis is configured and ready. (see Laravel Redis Configuration)
- Database: publish migration file:
php artisan vendor:publish --provider="Awssat\Visits\VisitsServiceProvider" --tag="migrations"
then migrate.
To adjust the package to your needs, you can publish the config file to your project's config folder using:
php artisan vendor:publish --provider="awssat\Visits\VisitsServiceProvider"
Note : Redis Database Name
- By default
laravel-visits
doesn't use the default laravel redis configuration (see issue #5)
To prevent any data loss add a new connection 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' // to 'laravel-visits'
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.
- You can track multiple kinds of visits to a single model using the tags as
visits($model,'tag1')->increment()
visits($post)->increment();
visits($post)->increment(10);
visits($post)->decrement();
visits($post)->decrement(10);
visits($post)->seconds(30)->increment()
Note: this will override default config setting (once each 15 minutes per IP).
visits($post)->forceIncrement();
visits($post)->forceDecrement();
- This will ignore IP limitation and increment/decrement every visit.
visits($post)->count();
Note: $post is a row of a model, i.e. $post = Post::find(22);
visits($post)->period('day')->count();
visits('App\Post')->count();
visits('App\Post')->period('day')->count();
visits($post)->countries();
visits($post)->refs();
visits($post)->operatingSystems();
visits($post)->languages();
visits('App\Post')->top(10);
visits('App\Post')->low(10);
visits('App\Post')->fresh()->top(10);
Note: you can always get uncached list by enabling
alwaysFresh
from package config.
visits('App\Post')->period('month')->top(10);
visits($post)->reset();
visits($post)->period('year')->reset();
visits($post)->reset('ips');
visits($post)->reset('ips','127.0.0.1');
- minute
- hour
- xhours [1hours ... to 12hours]
- day
- week
- month
- year
- quarter
- decade
- century
you can also make your custom period by adding a carbon marco in AppServiceProvider
:
Carbon::macro('endOf...', function () {
//
});
//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');
//increment/decrement methods offer ignore parameter to stop recording any items of ('country', 'refer', 'periods', 'operatingSystem', 'language')
visits('App\Post')->increment(1, false, ['country']);
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();
Please see CHANGELOG for more information on what has changed recently.
Please see CONTRIBUTING and CODE_OF_CONDUCT for details.
- An export command to save visits of any periods to a table on the database.
This project exists thanks to all the people who contribute. [Contribute].
Become a financial contributor and help us sustain our community. [Contribute]
Support this project with your organization. Your logo will show up here with a link to your website. [Contribute]
The MIT License (MIT). Please see License File for more information.