资源路由的正则表达式路由约束

时间:2014-03-24 23:25:30

标签: regex laravel laravel-4

Laravel提供了将正则表达式约束添加到这样的路线的可能性:

Route::get('user/{name}', function($name)
{
    //
})
->where('name', '[A-Za-z]+');

也可以为资源创建多个路径:

Route::resource('photo', 'PhotoController');

我想仅将正则表达式约束添加到路由GET /photo/{id}

可能吗?

4 个答案:

答案 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')