【问题标题】:Regular expression route constraint for a resource route资源路由的正则表达式路由约束
【发布时间】:2014-03-24 23:25:30
【问题描述】:

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

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

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

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

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

这可能吗?

【问题讨论】:

    标签: regex laravel laravel-4


    【解决方案1】:

    在 Laravel 5 资源丰富的路由参数can be named 是这样的:

    Route::resource('user', 'UserController', ['parameters' => [
       'user' => 'id'
    ]]);
    

    这可以和route patterns结合:

    Route::pattern('id', '[0-9]+');
    

    因此,您可以轻松地为路由参数定义单个全局约束,并将 if 用于所有资源丰富的路由。

    【讨论】:

      【解决方案2】:

      据我所知,你不能,但你可以使用类似这样的东西(路由过滤)来模仿:

      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...
      });
      

      【讨论】:

      • 我们如何在 laravel 5 中设置相同的功能?有什么想法吗?
      • 过滤器被替换为版本 - 5x 中的中间件。
      【解决方案3】:

      在您的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')。

      【讨论】:

        【解决方案4】:

        你应该覆盖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;
                    }
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-10
          • 2011-06-01
          • 2016-06-09
          • 1970-01-01
          • 1970-01-01
          • 2016-11-21
          • 1970-01-01
          • 2016-09-20
          相关资源
          最近更新 更多