【发布时间】:2018-04-19 06:00:18
【问题描述】:
在验证请求数据时,我们会得到被规则过滤掉的结果。比如下面的请求:
$this->post(route('test'), [
'foo' => 'bar',
'john' => 'doe'
]);
在我的控制器中,我有以下内容:
$data = request()->validate([
'foo' => 'required|string'
]);
如果我执行dd($data);,我会得到以下信息:
array:1 [
"foo" => "bar"
]
到目前为止一切顺利。但是,在使用数组时,例如,以下请求:
$this->post(route('test'), [
'foo' => 'bar',
'names' => [
'en' => 'Product',
'fr' => 'Produit',
'john' => 'Doe'
]
]);
然后在我的控制器中,我有以下内容:
$data = request()->validate([
'foo' => 'required|string',
'names' => 'array',
'names.en' => 'required|string',
'names.fr' => 'required|string'
]);
它将返回以下$data:
array:2 [
"foo" => "bar"
"names" => array:3 [
"en" => "Product"
"fr" => "Produit"
"john" => "doe"
]
]
现在我的问题是:
- 当我的验证规则中没有
'john' => 'doe'时,为什么我的names密钥中有它? - 有没有办法从数据中删除未指定的数组键?
更新
我已经测试了@JonasStaudenmeir 的建议,但结果不是我所期望的。
请求:
$this->post(route('test'), [
'names' => [
'en' => 'Doe',
'fr' => 'John'
]
]);
控制器:
$rules = [
'names' => 'array',
'names.en' => 'string'
];
dd(request()->only(array_keys($rules));
预期输出:
array:1 [
"names" => array:2 [
"en" => "Doe"
]
]
实际输出:
array:1 [
"names" => array:2 [
"fr" => "John"
"en" => "Doe"
]
]
【问题讨论】:
-
你能把表格也发一下吗?
-
@Alessandro.Vegna 没有表格。这是从
TestCase发送的请求。 -
1) 我想原因是
names验证,所以整个数组被保留。 -
我可能记错了,但是您调用
$this->post(route('test'), [...])的部分,您似乎实际上是在将"jonh" => "doe"作为请求数据传递? -
验证不会删除条目,它只是检查条目是否遵守规则。您可以使用 unset() 删除意外数据