【问题标题】:Laravel 5.6 Validation Array DataLaravel 5.6 验证数组数据
【发布时间】: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"
  ]
]

现在我的问题是:

  1. 当我的验证规则中没有 'john' => 'doe' 时,为什么我的 names 密钥中有它?
  2. 有没有办法从数据中删除未指定的数组键?

更新

我已经测试了@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() 删除意外数据

标签: laravel laravel-5


【解决方案1】:

对于只有嵌套规则 ('names.en') 但没有父规则 ('names') 的情况, 这将在 5.7 中修复:https://github.com/laravel/framework/pull/23708

在此之前,您可以使用此解决方法:

$data = request()->only(array_keys($rules));

如果你有父规则,实现起来会复杂得多。

我认为在验证数据中接收整个'names' 数组可以被视为预期行为。这个想法是验证器返回每个规则的数据。在您的情况下,它返回 'names' => 'array' 规则的数据,即整个 'names' 数组。

【讨论】:

  • 我错过了'names' => 'array' 规则,我更新了我的答案。
猜你喜欢
  • 2018-12-09
  • 1970-01-01
  • 2019-05-24
  • 2018-12-07
  • 2019-01-07
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多