php - 使用 urldecode 预处理流明路由参数
问题描述
我目前正在使用 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()
. 但由于这适用于每个控制器和功能,我想为此使用某种预处理步骤。
我已经尝试使用中间件来更改此处建议的路由参数(使用$request->route()->setParameter('key', $value);
)。
不幸的是,这在流明中不起作用,因为结果$request->route()
是一个数组而不是一个对象。我曾尝试更改此数组,但无法更改Request
对象中的实际数组。这里没有出现错误。
简而言之:我正在寻找一种方法来对传递给我的控制器和函数的每个 URL 参数进行 urldecode,而无需$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 解码版本。这还不够,因为这不会影响Request
对象中的路由数组。
为了应用这些更改,我更改了它,routeResolver
因此它将返回更改后的数组,而不是由 lumen 创建的数组。
推荐阅读
- reactjs - 测试通过但覆盖率没有更新 - Jest Enzyme - React JS
- ibm-watson - 使用 Watson 作为测试工具
- elasticsearch - Canvas 中的 Elasticsearch SQL 查询:它不像 SQL 那样工作?
- elasticsearch - 无法在弹性搜索中完全创建索引
- java - Android AudioTrack 替代品
- python - pandas(Python)中箱线图的数据限制和最大距离
- python - KNN 算法:“int”对象不可下标
- powershell - Powershell通过Thumbprint检索证书作为字符串与字符串变量
- javascript - 列出内存中的所有 Blob 以便在 javascript 中进行调试
- python - 开始函数 - 不正确的论点 - 不抛出错误