Laravel提供了将正则表达式约束添加到这样的路线的可能性:
Route::get('user/{name}', function($name)
{
//
})
->where('name', '[A-Za-z]+');
也可以为资源创建多个路径:
Route::resource('photo', 'PhotoController');
我想仅将正则表达式约束添加到路由GET /photo/{id}
可能吗?
答案 0 :(得分:8)
在Laravel 5资源丰富的路线参数can be named中,如下所示:
Route::resource('user', 'UserController', ['parameters' => [
'user' => 'id'
]]);
这可以与route patterns结合使用:
Route::pattern('id', '[0-9]+');
因此,您可以轻松地为路由参数定义单个全局约束,并对所有资源丰富的路由使用if。
答案 1 :(得分:3)
据我所知你不能,但你可能会模仿使用这样的东西(路由过滤):
public function __construct()
{
$this->beforeFilter('checkParam', array('only' => array('getEdit', 'postUpdate')));
}
这是使用构造函数进行路由过滤的示例,此处我只过滤了两种方法(您可以使用except
或根本不使用任何方法)并将filters.php
文件中的过滤器声明为如下:
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;
}
});
在这里,我手动检查第一个参数(parameters
方法返回传递给路线的所有参数的数组),如果它不是数字,则抛出NotFoundHttpException
异常。
您也可以通过注册这样的处理程序来捕获异常:
App::missing(function($exception){
// show a user friendly message or whatever...
});
答案 2 :(得分:0)
您应该覆盖IlluminateFoundation\Exceptions\Handler
:
if ($exception instanceof QueryException) {
if (str_contains($exception->getMessage(), "Invalid text representation:")) {
$requestId = $exception->getBindings()[0] ?? "";
App::abort(404);
// Or this one
throw new Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
} else {
throw $exception;
}
}
答案 3 :(得分:0)
在您的 RouteServiceProvider
boot()
方法中,只需使用 Route::pattern('parameter', 'regex')
引用参数名称。注意:参数名是路径的单数(如果路径是复数)。
public function boot()
{
Route::pattern('photo', '[0-9]+');
parent::boot();
}
这对两者都适用:
Route::resource('photo', 'PhotoController');
和
Route::resource('photos', 'PhotoController');
注意:如果您将参数输入到模型中,则没有必要。例如:
public function show(Photo $photo)
{
//
}
现在,如果传递了不匹配的参数,则将返回 404 | Not Found
。但如果您使用 Route::fallback()
处理不匹配的路由,则应保留 Route::pattern('parameter', 'regex')
。