I've been stuck on this for far too long. I am no expert in Laravel. I am currently using Statamic CMS as a headless CMS by which I grab data via the rest API. The default rate limit on these endpoints are 60, I want to amend this value. I am really struggling to get anything to work however.
I have created a RouteServiceProvider.php which looks like:
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Route;
use App\Http\Middleware\ThrottleRequests;
class RouteServiceProvider extends ServiceProvider
{
public function boot()
{
$this->configureRateLimiting();
parent::boot();
}
protected function configureRateLimiting()
{
Log::channel('single')->info('configureRateLimiting function fired');
RateLimiter::for('api', function (Request $request) {
Log::channel('single')->info('rate limit fired');
// Authenticated users: 1 requests/minute, else 1 requests/minute
return $request->user()
? Limit::perMinute(1)->by($request->user()->id)
: Limit::perMinute(1)->by($request->ip());
});
}
I register this new file in the bootstrap/providers.php file:
<?php
return [
App\Providers\AppServiceProvider::class,
App\Providers\RouteServiceProvider::class,
];
then finally in the routes/web.php file i have:
Route::middleware(['throttle:api'])
->prefix(config('statamic.api.route', 'api'))
->group(function () {
Log::info('Statamic API middleware applied');
// Get the original request and pass it through
Route::any('{any}', function($any) {
Log::info('API Request Details', [
'path' => request()->path(),
'method' => request()->method(),
'parameters' => request()->all()
]);
return response()->json([
'message' => 'Statamic API request handled with rate limiting.'
]);
})->where('any', '.*');
});
So the above actually works and logs everything as I would expect. If I attempt to remove the
return response()->json([
'message' => 'Statamic API request handled with rate limiting.'
]);
as I would just like the original API data to be returned it just hits the rate limit on every call. I have tried: return app()->handle(request());
but this does not work. I can't for the life of me work out how to simply allow the rate limiter to wrap around the api endpoints and continue to return the data until the point they hit the rate limit.
I'm sure I must be missing something simple as the Docs make it sound trivial: /rest-api#rate-limiting
Any pointers would be hugely appreciated.
I've been stuck on this for far too long. I am no expert in Laravel. I am currently using Statamic CMS as a headless CMS by which I grab data via the rest API. The default rate limit on these endpoints are 60, I want to amend this value. I am really struggling to get anything to work however.
I have created a RouteServiceProvider.php which looks like:
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Route;
use App\Http\Middleware\ThrottleRequests;
class RouteServiceProvider extends ServiceProvider
{
public function boot()
{
$this->configureRateLimiting();
parent::boot();
}
protected function configureRateLimiting()
{
Log::channel('single')->info('configureRateLimiting function fired');
RateLimiter::for('api', function (Request $request) {
Log::channel('single')->info('rate limit fired');
// Authenticated users: 1 requests/minute, else 1 requests/minute
return $request->user()
? Limit::perMinute(1)->by($request->user()->id)
: Limit::perMinute(1)->by($request->ip());
});
}
I register this new file in the bootstrap/providers.php file:
<?php
return [
App\Providers\AppServiceProvider::class,
App\Providers\RouteServiceProvider::class,
];
then finally in the routes/web.php file i have:
Route::middleware(['throttle:api'])
->prefix(config('statamic.api.route', 'api'))
->group(function () {
Log::info('Statamic API middleware applied');
// Get the original request and pass it through
Route::any('{any}', function($any) {
Log::info('API Request Details', [
'path' => request()->path(),
'method' => request()->method(),
'parameters' => request()->all()
]);
return response()->json([
'message' => 'Statamic API request handled with rate limiting.'
]);
})->where('any', '.*');
});
So the above actually works and logs everything as I would expect. If I attempt to remove the
return response()->json([
'message' => 'Statamic API request handled with rate limiting.'
]);
as I would just like the original API data to be returned it just hits the rate limit on every call. I have tried: return app()->handle(request());
but this does not work. I can't for the life of me work out how to simply allow the rate limiter to wrap around the api endpoints and continue to return the data until the point they hit the rate limit.
I'm sure I must be missing something simple as the Docs make it sound trivial: https://statamic.dev/rest-api#rate-limiting
Any pointers would be hugely appreciated.
Share Improve this question asked Feb 4 at 10:44 wizzer711wizzer711 214 bronze badges 2 |1 Answer
Reset to default 0You might be better asking in the Statamic Discord or on GitHub Discussions. The Statamic Community isn't very active here on StackOverflow.
app()->handle(request())
dispatches the same request again (with throttle), so it immediately hits the limit. – A. El-zahaby Commented Feb 4 at 23:21