我想使用允许的密钥白名单来清理请求负载的关联元素。
我的
$request
看起来像:
{"input1":"50","input2":"0","input3":"60000"}
我的白名单
$validkeys
:
{"input1","input2","input3","input4","input5"}
如果我使用
only()
,我会得到 null
默认值,其中请求负载没有对应的值。
$request->only($validkeys)
毫无帮助地变成:
{"input1":"50", "input2":"0", "input3":"60000", "input4":null, "input5":null}`
如果我调用
intersect()
,松散比较会删除具有 0
值的元素。
$request->intersect($validkeys)
毫无帮助地变成:
{"input1":"50", "input3":"60000"}`
我想要的只是
$request
和验证。
我觉得这个更短。
$validated = array_intersect_key($request->all(), array_flip($validkeys));
这可能对您的情况有所帮助。此代码使用 Request
only
方法获取请求密钥,然后将其放入集合中,使用 $value !== null
对其进行过滤,以便 0
应该仍然存在。
// Put request values into collection
$valid = collect($request->only('input1', 'input2', 'input3'));
// Filter values
$valid = $valid->filter(function ($value) {
return $value !== null;
});
// We get it back as an array
$valid = $valid->all();
实现此目的的另一种方法是:
$requestValidKeys = $request->keys()->intersect($validkeys);
$requestValid = $request->only($requestValidKeys);
所以基本上你只与键相交。使用这些有效的密钥,您可以调用
only()
。
另一种选择是使用集合来过滤
$request
,这可以使读取比数组翻转/相交更清晰一些:
collect($request->all())->filter(function ($_, $key) {
return collect($validKeys)->contains($key);
});
显然最新版本的 Laravel (11) 已经实现了
only()
以避免在输出中添加空值。我不知道这个变化是什么时候发生的,但现在已经修复了。
代码:(PHPize演示)
$collection = collect([
"input1" => "50",
"input2" => "0",
"input3" => "60000",
"input6" => "777",
]);
var_export(
$collection->only(["input1" , "input2" , "input3", "input4", "input5"])
);
输出:
\Illuminate\Support\Collection::__set_state(array(
'items' =>
array (
'input1' => '50',
'input2' => '0',
'input3' => '60000',
),
'escapeWhenCastingToString' => false,
))