Never found models or objects past their expiration time.
use Illuminate\Support\Facades\Route;
use App\Models\Payment;
use App\Models\Party;
Route::get('/payment/{payment}', function (Payment $payment) {
// ...
})->middleware('expires');
Your support allows me to keep this package free, up-to-date and maintainable. Alternatively, you can spread the word!
The expires
middleware looks for the expired_at
attribute or property for last route parameter. Once found, it checks if the current time is below the value.
use Illuminate\Support\Facades\Route;
use App\Models\Payment;
Route::get('payment/{payment}', function (Payment $payment) {
// ...
})->middleware('expires');
If you have multiple route parameters, and you don't want to make the check against the last route parameter, prepend the name of the parameter to the middleware arguments.
use Illuminate\Support\Facades\Route;
use App\Models\Payment;
use App\Models\Detail;
Route::get('payment/{payment}/detail/{detail}', function (Payment $payment, Detail $detail) {
// ...
})->middleware('expires:payment');
By setting the route parameter, you can use dot.notation
to traverse the object and find the expiration time if it's not the default expired_at
.
use Illuminate\Support\Facades\Route;
use App\Models\Payment;
use App\Models\Detail;
Route::get('payment/{payment}/detail/{detail}', function (Payment $payment, Detail $detail) {
// ...
})->middleware('expires:payment.dates.due_at');
If your model doesn't have an expiration time, but you want to calculate the expiration time from another attribute, like the created_at
, you may issue a second argument as an expiration time.
If you issue a number, it will be used as the amount of minutes. Any other string will be parsed by strtotime()
.
use Illuminate\Support\Facades\Route;
use App\Models\Payment;
use App\Models\Detail;
use App\Models\Party;
Route::get('party/{party}', function (Party $party) {
// ...
})->middleware('expires:party,60');
Route::get('payment/{payment}/detail/{detail}', function (Payment $payment, Detail $detail) {
// ...
})->middleware('expires:payment.created_at,24 hours');
Warning
If the property or attribute doesn't exist or returns null
, it will be assumed the model has not expired yet.
Both middlewares are not limited to only Eloquent Models. It can be any object (even an array) that has a timestamp or a datetime, since the check is done by retrieving the value through data_get()
and then parsed by Laravel's Date Factory.
use Illuminate\Support\Facades\Route;
class Thing
{
public function __construct(public $expiredAt = 'yesterday')
{
// ...
}
}
Route::bind('thing', fn($value) => new Thing($value));
Route::get('some/{thing}', function (Thing $thing) {
// ...
})->middleware('expires:thing.expiredAt');
You may also use the Expire
middleware to fluently configure it. It's a great way to set relative time expressively.
use Illuminate\Support\Facades\Route;
use Laragear\ExpireRoute\Http\Middleware\Expires;
Route::get('/payment/{payment}')->middleware(Expires::by('payment')->in(1)->hour()->and(30)->minutes());
Route::get('/payment/{payment}')->middleware(Expires::by('payment')->after('next monday');
Route::get('/payment/{payment}')->middleware(Expires::by('payment.expiration_time'));
- There are no singletons using a stale application instance.
- There are no singletons using a stale config instance.
- There are no singletons using a stale request instance.
- There are no static properties written during a request.
There should be no problems using this package with Laravel Octane.
If you discover any security related issues, please email [email protected] instead of using the issue tracker.
This specific package version is licensed under the terms of the MIT License, at time of publishing.
Laravel is a Trademark of Taylor Otwell. Copyright © 2011-2024 Laravel LLC.