使用 urldecode 预处理流明路由参数

Posted

技术标签:

【中文标题】使用 urldecode 预处理流明路由参数【英文标题】:Preprocess lumen route parameters with urldecode 【发布时间】:2019-03-28 14:16:33 【问题描述】:

我目前正在使用 lumen 框架(5.6)来构建一个 API,这个 API 可以用来请求一个页面,例如它的标题。这条路线是:

Route::group(["prefix" => '/api/v1', "middleware" => ["ContentTypeJson","Paginator"]], function () 


    Route::group(["prefix" => '/databaseIdentifier', "middleware"=>"DatabaseIdentifier"], function () 

        Route::group(["prefix" => '/pages'], function () 

            Route::group(["prefix" => '/title'], function () 

                Route::get("/", "PageController@getPageByTitle");

                Route::get("/parents", "SearchController@getParentalSpecies");

                Route::get("/all", "PageController@getPageByTitleWithLinks");

                Route::get("/overlap/overlapProperty", "PageController@getPagesWithOverlap");

                Route::put("/", "PageController@overwritePage");

            );

        );
);

如您所见,title 用于多个函数和控制器中,databaseIdentifier 也是如此,它在中间件中用于确定需要使用哪个数据库。

但是,所有带有空格的 url 参数都将转换为 %20 而不是空格,这是预期的行为。但是我想将其转换回原始字符串,这可以使用urldecode() 完成。 但由于这适用于每个控制器和功能,我想为此使用某种预处理步骤。

我已尝试为此使用中间件来更改路由参数,如建议的here(使用$request->route()->setParameter('key', $value);)。

不幸的是,这在流明中不起作用,因为$request->route() 的结果是一个数组而不是一个对象。我尝试更改此数组,但无法更改Request 对象中的实际数组。这里没有出现错误。

简而言之:我正在寻找一种方法来对传递给我的控制器和函数的每个 URL 参数进行 urldecode,而无需将$param = urldecode($param); 放在任何地方。

如果您需要更多信息,请随时询问 提前谢谢你

【问题讨论】:

【参考方案1】:

对于同样遇到此问题的任何人,我已经找到了使用中间件的解决方案。

在中间件中我执行以下操作:

public function handle(Request $request, Closure $next)
    
        $routeParameters = $request->route(null)[2];

        foreach ($routeParameters as $key=>$routeParameter) 
            $routeParameters[$key] = urldecode($routeParameter);
        

        $routeArray = $request->route();
        $routeArray[2] = $routeParameters;
        $request->setRouteResolver(function() use ($routeArray)
        
            return $routeArray;
        );

        return $next($request);
    

此代码将解码每个路由参数并将其保存在一个数组中,然后我采用由 lumen 本身创建的整个路由数组(其中包含 url 编码参数),然后将这些替换为 url 解码版本的范围。这还不够,因为这不会影响Request 对象中的路由数组。

为了应用这些更改,我更改了routeResolver,因此它将返回更改后的数组,而不是由 lumen 创建的数组。

【讨论】:

以上是关于使用 urldecode 预处理流明路由参数的主要内容,如果未能解决你的问题,请参考以下文章

单元测试:如何在流明中模拟具有路由参数的请求

流明类路由未找到

流明框架路由不起作用

在没有数据库队列驱动程序的情况下完成流明作业调度

使用参数流明重定向

Web容器自己主动对HTTP请求中參数进行URLDecode处理