php - Validating route parameters to be greater than zero in Laravel
How can I validate {id} to be greater than zero in the following route?
Route::get('/posts/{id}/show', [PostController::class, 'show'])->whereNumber('id');
Answer
Solution:
Following the Laravel 9.x documentation, you should be able to do this:
Route::get('/posts/{id}/show', [PostController::class, 'show'])
->where('id', '([1-9]+[0-9]*)');
You can see that regex works for number >= 1
: https://regex101.com/r/MFxO2h/2
Checking the source code, you can see that whereNumber
is number >= 0
, that is why 0
works.
As @TimLewis commented, you can also use Model Binding, it will automatically try to check if a model you want exists with the parameter ID on the route.
In your case, let's assume {id}
is a Post
's ID, so your Route would be like this:
Route::get('/posts/{post}/show', [PostController::class, 'show']);
Then, your controller:
public function show(Request $request, Post $post)
{
// ...
}
If no {post}
(id) matches a Post's ID, then 404
, else the controller correctly executes the methods show
.