Laravel 数组:密钥验证

Posted

技术标签:

【中文标题】Laravel 数组:密钥验证【英文标题】:Laravel Array:Key Validation 【发布时间】:2022-01-01 11:12:10 【问题描述】:

我的 Laravel 后端接收到一个 JSON 转换的 javascript 数组并将其解码为以下 php 数组:

dd($cart) 已编辑的键已更改

array:4 [▼
  "personcount" => 2
  "person1" => array:2 [▼
     "Customer" => array:2 [▶]
      "Items" => array:5 [▼
        "key1" => 0
        "key2" => 0
        "key3" => 0
        "key4" => 0
        "key5" => 1
      ]
       
  ]
  "person2" => array:2 [▼
     "Customer" => array:2 [▶]
     "Items" => array:5 [▶]
  ]
]

我创建了一个过滤器中间件,它应该验证给定的数组并在失败时重定向回来。

Filter.php EDITED 添加了新的(不工作的)验证规则方法

$cart = json_decode($request->input('cart'), true);

$validation_rules = [];

$TotalItemCount = 0;

for ($i = 1; $i <= $person_count; $i++) 

    foreach ($cart[$i]["Items"] as $Item => $ItemCount) 
        $TotalItemCount += $ItemCount;
    

    $validation_rules += [
        "person$i.Customer.FirstName" => "required|string|min:2|max:255",
        "person$i.Customer.LastName" => "required|string|min:2|max:255",
        "person$i.Items.*" => "required|numeric",
        "person$i.Items" => ['required', 'array',
                    Rule::in(["Key1", "Items"]),
                ],
    ];

$validated_input = Validator::make($cart, $validation_rules);

验证器似乎忽略了 $i.Items 验证规则。 我什至将 size:5 更改为 size:6 必须 100% 触发错误,因为给定的 Item Array 始终只包含 5 个元素。

此外,我尝试验证数组键:

"$i.Items" => "required|array:key1,key2,key3"

它也根本没有开火。我希望所有密钥都是必需的。 名/姓规则适用。

我很高兴收到建议。

【问题讨论】:

$v = Validator::make([2, ['items' => [2]]], ['1.items.*' => 'integer']);在我的机器上工作,您对 $i 的使用一定有问题,或者 items 数组的格式很奇怪,但这不包括在问题中。 很抱歉我无法添加答案(我正在打电话),但是您可以使用 Laravel 验证器来验证数组,而无需遍历每个条目,阅读 this part,您应该可以执行*.items 或任何其他键。 到目前为止,我认为问题在于使用非键控数组进行输入,因此我认为需要这个解决方案。在完美的世界里,我会改变这种结构。 @mrhn 我不明白你的功能。此外,我更改了数组,但我仍然不知道如何验证它们的键。 你能显示哪些项目包含吗? 【参考方案1】:

经过大量研究和努力,我找到了解决方案:

对于拼命寻找 Laravel 8+ 中高级数组验证示例的每个人:

    步骤:总是使用数组,而不是对象。 为此:
public function fCreateArrayFromObject($Object) 
            $toArray = function ($x) use (&$toArray) 
                return is_scalar($x)
                    ? $x
                    : array_map($toArray, (array)$x);
            ;
   
return $toArray($Object);

    步骤:我将使用我的示例向您展示它是如何轻松完成的:

我的数组($cart):

array:3 [▼
  "user1" => array:2 [▼
    "Items" => array:5 [▼
      "blue" => 0
      "grey" => 1
      "brown" => 1
      "look" => 0
      "black" => 0
    ]
    "User" => array:2 [▼
      "LastName" => "alice"
      "FirstName" => "Bobby"
    ]
  ]
  "user2" => ......
]

我的规则:

$person_count = 2; // Up to 5

$validation_rules = [];
        
        for ($i = 1; $i <= $person_count; $i++) 

            $validation_rules += [
                "user$i" => "array:Items,Customer|size:2|distinct",
                "user$i.user.FirstName" => "required|string|min:2|max:255",
                "user$i.user.LastName" => "required|string|min:2|max:255",
                "user$i.Items.*" => "required|numeric|min:0",
                "user$i.Items" => "required|array:blue,grey,brown,look,black|size:5|distinct",
          
            ];
        

行动:

$validated_input = Validator::make((array)$cart, $validation_rules);

我不太确定,为什么 make 方法不会将没有 (array) 的 $cart 数组解释为数组,但它可以工作。 目标:

验证整个购物车:必须将每个人作为一个数组包含正好 2 个元素(最多五个人数组)有效 验证每个人本身:必须包含用户和项目数组作品 验证用户数组:必须包含 2 到 255 个字符之间的名字和姓氏作为字符串有效 验证 Items 数组:大小必须完全为 5,必须包含所有给定的键 有效 验证 Items 数组的键值:它们必须是数字且至少为 0 有效

显然一切都必须存在:“必需”

标签:Laravel 数组验证、Laravel 嵌套数组验证

【讨论】:

【参考方案2】:

而不是

 "required|array:key1,key2,key3"

你会做类似的事情

'required|in:' . $this->array() . ''

【讨论】:

$this->array() 的输出应该是什么? 应该是输入应该是其中之一的值数组。 $items

以上是关于Laravel 数组:密钥验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.5 中验证 Mailchimp api 密钥

如何在没有密钥或没有验证的情况下解码 php/laravel 中的 jwt?

订阅私人频道时的 Pusher/Laravel 回显错误:订阅频道的身份验证值无效:格式应为“密钥:签名”

Laravel 5 - 根据需要验证数组,但允许传递一个空数组

如何使用 proengsoft/laravel-jsvalidation 和 Laravel 5 验证数组输入

如何在 Laravel 中验证数组?