Laravel 5.6验证阵列数据

时间:2018-04-18 16:02:06

标签: laravel laravel-5

验证请求数据时,我们会通过规则筛选出结果。例如,以下请求:

$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在我的$this->post(route('test'), [ 'names' => [ 'en' => 'Doe', 'fr' => 'John' ] ]); 密钥中?
  2. 有没有办法从数据中删除未指定的数组键?
  3. 更新

    我已经测试了@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

1 个答案:

答案 0 :(得分:0)

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

中修复

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

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

如果您有父规则,那么实现起来要复杂得多。

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