使用urldecode预处理管腔路径参数

时间:2018-10-24 08:33:07

标签: php laravel api lumen

我目前正在使用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参数进行url解码,而不用将$param = urldecode($param);放在各处。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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