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.

Source