Regular expression route constraint for a resource route
As far as I know you can't but you may mimic that using something like this (route filtering):
public function __construct()
{
$this->beforeFilter('checkParam', array('only' => array('getEdit', 'postUpdate')));
}
This is an example of route filtering using the constructor and here I've filtering only two methods (you may use except
or nothing at all) and declared the filter in filters.php
file as given below:
Route::filter('checkParam', function($route, $request){
// one is the default name for the first parameter
$param1 = $route->parameter('one');
if(!preg_match('/\d/', $param1)) {
App::abort(404);
// Or this one
throw new Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
}
});
Here, I'm checking the first parameter manually (parameters
method returns an array of all parameters passed to the route) and if it's not a digit then throwing NotFoundHttpException
exception.
You may also catch the exception by registering a handler like this:
App::missing(function($exception){
// show a user friendly message or whatever...
});
In Laravel 5 resourceful route parameters can be named like this:
Route::resource('user', 'UserController', ['parameters' => [
'user' => 'id'
]]);
This can be combined with route patterns:
Route::pattern('id', '[0-9]+');
So you can easily define a single global constraint for route parameters and use if for all of your resourceful routes.
In your RouteServiceProvider
boot()
method, just reference the parameter name using Route::pattern('parameter', 'regex')
. Note: the parameter name is the singular (if path is plural) of the path.
public function boot()
{
Route::pattern('photo', '[0-9]+');
parent::boot();
}
This would work for both:
Route::resource('photo', 'PhotoController');
and
Route::resource('photos', 'PhotoController');
Note: if you typehint your parameter to the model, this is not necessary. For example:
public function show(Photo $photo)
{
//
}
Now, if a non-matching parameter is passed, a 404 | Not Found
will be returned. But if you are using Route::fallback()
to handle unmatched routes, you should keep Route::pattern('parameter', 'regex')
.