refactor(backurl): add mergeQueryToCurrentPath for safe self links
This commit is contained in:
@@ -95,6 +95,32 @@ class BackUrl
|
|||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合并 query 到当前 path(不自动处理 back),用于“保留筛选上下文但不透传 back”的场景。
|
||||||
|
*
|
||||||
|
* @param array $baseQuery 例如 request()->query() 并移除 back 后的数组
|
||||||
|
* @param array $overrides 覆盖字段(null 表示删除)
|
||||||
|
*/
|
||||||
|
public static function mergeQueryToCurrentPath(array $baseQuery, array $overrides = []): string
|
||||||
|
{
|
||||||
|
$q = $baseQuery;
|
||||||
|
|
||||||
|
foreach ($overrides as $k => $v) {
|
||||||
|
if ($v === null) {
|
||||||
|
unset($q[$k]);
|
||||||
|
} else {
|
||||||
|
$q[$k] = $v;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$url = '/' . ltrim(request()->path(), '/');
|
||||||
|
if (count($q) > 0) {
|
||||||
|
$url .= '?' . \Illuminate\Support\Arr::query($q);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 给指定站内相对路径附加安全 back(若 back 为空则原样返回)。
|
* 给指定站内相对路径附加安全 back(若 back 为空则原样返回)。
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -13,23 +13,10 @@
|
|||||||
unset($currentQuery['back']);
|
unset($currentQuery['back']);
|
||||||
$back = $selfWithoutBack;
|
$back = $selfWithoutBack;
|
||||||
|
|
||||||
// 用于构建“保留当前筛选上下文”的站内跳转链接(且不透传 back,避免嵌套/污染)
|
// 用于构建“保留当前筛选上下文”的站内跳转链接:统一抽到 BackUrl,避免 Blade 内闭包口径漂移。
|
||||||
|
// 说明:这里不透传 back(避免嵌套/污染)。
|
||||||
$buildSelfUrl = function (array $overrides = []) use ($currentQuery) {
|
$buildSelfUrl = function (array $overrides = []) use ($currentQuery) {
|
||||||
$q = $currentQuery;
|
return \App\Support\BackUrl::mergeQueryToCurrentPath($currentQuery, $overrides);
|
||||||
foreach ($overrides as $k => $v) {
|
|
||||||
if ($v === null) {
|
|
||||||
unset($q[$k]);
|
|
||||||
} else {
|
|
||||||
$q[$k] = $v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$url = '/' . ltrim(request()->path(), '/');
|
|
||||||
if (count($q) > 0) {
|
|
||||||
$url .= '?' . \Illuminate\Support\Arr::query($q);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $url;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// back 安全护栏(全页通用):
|
// back 安全护栏(全页通用):
|
||||||
|
|||||||
Reference in New Issue
Block a user