Php 使用urldecode预处理流明路径参数
我目前正在使用lumen框架(5.6)构建一个API,该API可以用于请求页面,例如页面标题。这方面的路线是:Php 使用urldecode预处理流明路径参数,php,laravel,api,lumen,Php,Laravel,Api,Lumen,我目前正在使用lumen框架(5.6)构建一个API,该API可以用于请求页面,例如页面标题。这方面的路线是: Route::group(["prefix" => '/api/v1', "middleware" => ["ContentTypeJson","Paginator"]], function () { Route::group(["prefix" => '/{databaseIdentifier}', "middleware"=>"DatabaseI
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");
});
});
});
正如您可以看到的那样,标题
用于多个函数和控制器,同样适用于数据库标识符
,该标识符在中间件中用于确定需要使用哪个数据库
但是,所有带有空格的url参数将使用%20
而不是空格进行转换,这是预期的行为。但是,我想将其转换回原始字符串,这可以通过urldecode()
完成。
但由于这适用于每个控制器和函数,我想使用某种预处理步骤
我已经尝试使用一个中间件按照建议更改路由参数(使用$request->route()->setParameter('key',$value);
)
不幸的是,这在lumen中不起作用,因为$request->route()
的结果是数组而不是对象。我已尝试更改此数组,但无法使其更改请求
对象中的实际数组。此处不显示任何错误
简言之:我正在寻找一种方法来对传递给我的控制器和函数的每个URL参数进行URL解码,而无需放入$param=urldecode($param)代码>无处不在
如果您需要更多信息,请随时询问
提前感谢您对于遇到此问题的任何人,我已经找到了使用中间件的解决方案
在中间件中,我执行以下操作:
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解码版本。这还不够,因为这不会影响请求
对象中的路由数组
为了应用这些更改,我更改了routeResolver
,因此它将返回更改后的数组,而不是lumen创建的数组