laravel 资源路由中id参数验证

什么是资源路由

项目中有很多资源路由,如:
Route::resource("shop", 'ShopController');
这个资源路由默认的参数名是shop,即请求shop/111时,通过route->parameters()获取路由参数得到的是["shop"=>111].资源处理器各个动作如图:

image.png

为什么要自己处理资源路由验证?

这种资源路由无法使用laravel的全局范围内的路由参数正则表达式校验,因为定义这种校验规则需要写死一个参数名,如下:

/**
 * 定义路由模型绑定,模式过滤器等
 *
 * @param  \Illuminate\Routing\Router  $router
 * @return void
 * @translator  https://xueyuanjun.com
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');
    parent::boot();
}

所以想要全局统一验证这个资源路由中id格式是否正确,不能用这个方法.

可行的方法有:

二选一即可.

1.通过写中间件进行校验

...
    public function handle(Request $request, Closure $next)
    {
        $route = $request->route();

        //检查资源路由器上的id,
        //如:Route::resource("shop", 'ShopController'); ,请求shop/111时,如果111是非数字字符,则会走此校验
        $actionMethod = $route->getActionMethod();
        if ($actionMethod == "show") {
            $firstRouterParam = Arr::first(($route->parameters()));
            if ($firstRouterParam) {
                if (!preg_match('/\d/', $firstRouterParam)) {
                    //ResourceException 是我自己封装的异常
                    throw new ResourceException("无效的查询参数:".$firstRouterParam);
                    //或者 App::abort(404);
                   // throw new Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
                }
            }
        }
    }
...

2. 通过重写异常处理者处理

重写异常处理者 Illuminate\Foundation\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;
//我代码中是:  throw new ResourceException("查询参数错误,无效的id:".$requestId);
            } else {
               throw $exception;
            }
        }

推荐阅读更多精彩内容

  • 先说几句废话,调和气氛。事情的起由来自客户需求频繁变更,伟大的师傅决定横刀立马的改革使用新的框架(created ...
    wsdadan阅读 1,285评论 0 10
  • 路由 路由(routing)就是通过互联的网络把信息从源地址传输到目的地址的活动。路由发生在OSI网络参考模型中的...
    Dearmadman阅读 2,020评论 2 9
  • Laravel框架一:原理机制篇 Laravel作为在国内国外都颇为流行的PHP框架,风格优雅,其拥有自己的一些特...
    Mr_Z_Heng阅读 868评论 0 12
  • 1、简介 Laravel 提供了多种方法来验证应用输入数据。默认情况下,Laravel 的控制器基类使用Valid...
    伊Summer阅读 450评论 0 3
  • 基本路由 应用中的大多数路都会定义在 app/routes.php 文件中。最简单的Laravel路由由URI和闭...
    风寒夜末阅读 2,238评论 0 0