i created a page visit function that works with laravel throttle. each ip/user can increase visit counter every 60 minutes. i have a problem that can't apply throttle on different ids and throttle works on route only 1 time per 60 minutes and does'nt care about ids: (/home/visit/3 , /home/visit/4 ,.....): 1 time every 60 mins
route.php:
Route::post('/home/visit/{id}',[HomeController::class,'counter_visit'])->middleware('throttle:visit');
RouteServiceProvider.php
RateLimiter::for('visit', function (Request $request) {
return $request->user()
? Limit::perHour(1)->by($request->user()->id)
: Limit::perHour(1)->by($request->ip());
});
how can i apply throttle for each id like below?
/home/visit/3 : 1 time every 60 mins /home/visit/4 : 1 time every 60 mins
thanks for your helps
i found the easiest way(maybe). just create a custom middleware extending ThrottleRequests.
php artisan make:middleware ThrottleById
Http\middleware\ThrottleById.php.
<?php
namespace App\Http\Middleware;
use Illuminate\Routing\Middleware\ThrottleRequests;
class ThrottleById extends ThrottleRequests
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
protected function resolveRequestSignature($request)
{
$token = $request->route()->parameter('id');
return $token;
}
}
this function creates uique signature for each url if id parameter of route is different then just add this middleware to kernel.php same as part 3 & 4 in https://stackoverflow.com/a/75869783/9241751
thanks to Balaji Kandasamy