验证请求数据时,我们会通过规则筛选出结果。例如,以下请求:
$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
在我的$this->post(route('test'), [
'names' => [
'en' => 'Doe',
'fr' => 'John'
]
]);
密钥中?我已经测试了@JonasStaudenmeir的建议,但结果并非我的预期。
请求:
$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"
]
]
实际输出:
PowerShell
答案 0 :(得分:0)
对于仅包含嵌套规则('names.en'
)但没有父规则('names'
)的情况,
这将在5.7:https://github.com/laravel/framework/pull/23708
在此之前,您可以使用此解决方法:
$data = request()->only(array_keys($rules));
如果您有父规则,那么实现起来要复杂得多。
我认为在验证数据中接收整个'names'
数组可以被视为预期的行为。这个想法是验证器返回每个规则的数据。在您的情况下,它会返回'names' => 'array'
规则的数据,这是整个'names'
数组。