Add expiring feature to Eloquent models in Laravel 5.
This has been developed to simplify adding expirable
feature to any eloquent model on your laravel project.
To install the package via Composer:
$ composer require yarob/laravel-expirable
Then, update config/app.php
by adding an entry for the service provider.
'providers' => [
// ...
Yarob\LaravelExpirable\ServiceProvider::class,
];
Finally, via terminal, publish the default configuration file (if you need to, see below):
php artisan vendor:publish --provider="Yarob\LaravelExpirable\ServiceProvider"
Your models can now use the Expirable
trait.
You must also add expire_at
to your $dates
array in the model as shown in the example below
use Yarob\LaravelExpirable\Expirable;
class User extends Model
{
use Expirable;
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = [
'expire_at'
];
}
Your model MUST have column named expire_at
in the database to store the expiry date value.
You can add this manually via a migration on the intended model $table->timestamp('expire_at')->nullable();
.
There are three basic functions in Expirable
trait:
hasExpired()
to check if model has expired or not returnsboolean
timeToLive()
returns number of seconds left on models life, could be minus if has expired already! returnsfalse
if not applicable.reviveExpired($numberOfSeconds=null)
if model has expired you can then revive it by using this function and supplying$numberOfSeconds
revival period starting fromnow()
. If$numberOfSeconds
is not supplied then will default back to the value set inexpirable.php
in config folder, if set! Otherwise it will not do anything and returnsfalse
.- Model has
null
expiry date means a non-expirable model and lives forever, e.g.$user->expire_at = null;
Example:-
$user = App\User::get();
foreach($users as $user) {
if($user->hasExpired())
{
var_dump($user->timeToLive());
$user->reviveExpired();
var_dump($user->timeToLive());
}
else
{
$user->expire_at = \Carbon\Carbon::now()->addDay(-10);// you can add minus values
$user->save();
var_dump($user->timeToLive());
}
}
Expired models (passed it’s expiry date) will automatically be excluded from query results. For example:-
$users = App\User::get();
will only gets models that has NOT expired or has null
expiry date. Any expired models WILL be auto-excluded.
You can force expired models to appear in query results using withHasExpiry
$users = App\User::withHasExpiry()->get();
The onlyHasExpiry
method can be used on a relationship query:
$users = App\User::onlyHasExpiry()->get();
This will exclude ONLY null
expiry date from results.
Please note this will get ALL models that have non null
expiry date, regradless of their expiry date.
The withoutHasExpiry
method can be used in this case:
$users = App\User::withoutHasExpiry()->get();
This will bring models that has null
expiry date.
Configuration is not usually needed, unless you want to set a default revival time to a model(s). A default value of 86400 seconds
is set for user model, as an example, but feel free to change that to any value you want.
Here is an example configuration:
return [
/**
* Revival Time in seconds used to extend life in expired models
*/
'User' => [
'revival_time' => 24*60*60,
]
];
Pay attention that Model name in expirable.php
is case sensitive! so if you have a foo
Model, then
return [
'foo' => [
'revival_time' => 24*60*60,
],
];
laravel-expirable was written by Yarob Al-Taay and is released under the MIT License.
Copyright (c) 2017 Yarob Al-Taay