Laravel10 中间件 如何过滤空和NULL参数?
1. 运行环境
1). 当前使用的 Laravel 版本?
Laravel 10
2. 问题描述?
如何在 Middleware 中进行参数过滤,并在控制器中获取到过滤后的参数?
在 Middleware 中过滤参数后,打印 $request->all() 是成功过滤后的参数,但在控制器里再次打印 $request->all(),又变成了过滤前的参数。
提交参数
[
'login_name' => 'test - 1',
'real_name' => 'test - 2',
'describe' => '',
]
Middleware 与 Controller 输出结果
Middleware 断点输出
Array
(
[login_name] => 'test - 1'
[real_name] => 'test - 2',
)
Controller 断点输出
Array
(
[login_name] => 'test - 1'
[real_name] => 'test - 2',
[describe] => '',
)
Middleware 代码
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class FilterParameter
{
public function handle(Request $request, Closure $next): Response
{
$request = collect($request)->filter(function ($request) {
return $request != '' && !is_null($request);
});
// print_r($request->all());exit();
return $next($request);
}
}
3. 您期望得到的结果?
在控制器中获取过滤后的参数
4. 解决方案
public function handle(Request $request, Closure $next): Response
{
$parameter = $request->all();
foreach ($parameter as $key => $value) {
if ($value == '') {
// 成功从 $request->all() 中删除了参数
$request->query->remove($key);
}
}
return $next($request);
}
此前尝试了
$request->replace();
$request->offsetUnset();
$request->except();
等各种方法,但在控制器中依旧能获取被删除的参数,最后跟了下 $request->all() 源码,发现是从 $this->input()里拿的参数。
$input = array_replace_recursive($this->input(), $this->allFiles());
于是又跟了下 $this->input(),看到 $this->query->all()
$this->getInputSource()->all() + $this->query->all(), $key, $default
最后尝试从 $this->query 里删除,结果成功了。
因为
这段代码改变了,Request类的属性了
laravel 有个
\Illuminate\Foundation\Http\Middleware\TrimStrings
中间件专门过滤参数值的空格,你可以参照这个中间件修改成自己的业务需求,而且它可以过滤多维数组的参数,完全满足你的需求