Laravel 5.4:动态验证规则

Posted

技术标签:

【中文标题】Laravel 5.4:动态验证规则【英文标题】:Laravel 5.4 : Dynamic validation rule 【发布时间】:2018-01-12 05:54:30 【问题描述】:

我很难找到问题的答案,而且我的测试并没有被证明是有用的。所以也许这里有人会遇到我面临的同样问题。

我的输入具有以下类型的模式名称projects-0-1project-0-2project-1-0 等等... 这些是文件输入,因此人们可以上传文档/图像.

因此,基本上,我一直在尝试获取(理想情况下)类似的验证消息:

$validator->getMessageBag()->add('project-*-*', 'File is empty!');

$validator->getMessageBag()->add('project-*', 'File is empty!');

我已经尝试了几件事,但似乎没有任何效果。

我要添加自定义消息的原因是,如果 $request 对象为空,则根本不会验证该文件。所以我首先需要检查$request->hasFile 是否存在,如果它不想添加错误消息。

需要考虑的事项:

输入可以动态添加到表单中,所以我不知道我需要事先验证的文件输入的确切数量。

即使这不应该影响代码和验证,值得注意的是,当我将表单嵌入另一个网站时,一切都是通过 ajax 发生的。因此我创建了端点等...

有什么提示吗?

【问题讨论】:

你试过这样'file.*.mimes' => 'Only PDF, JPEG, PNG are allowed.',***.com/a/45188623/5148479 是的,我尝试了所有爵士乐,但没有帮助。我对验证本身没有问题,但是当这些不是请求的一部分时,将错误消息与文件输入相匹配,因为在提交表单时它们仍然是空的。 我基本上需要的是在我的规则数组中的输入名称中放置一个通配符:$globalRules = [ ... 'project_documents-0-0' => 'required|file', ... ]; 我希望最后的规则能够匹配破折号后 0-9 之间的任何数字..所以我认为这样的事情会做:'project_documents-*-*' => 'required|file', 但实际上它不会.. 【参考方案1】:

好的,如果有人也遇到这个问题,请回到这里。我找到了一种到达那里的“hacky”方式,它对我有用。

由于每个输入文件都被动态添加到 DOM,我添加了一个额外的隐藏输入,它将文件输入的名称保存为一个值。

然后在我的控制器中我会这样做:

public function createValuesKeyArray ($preset)

    $regexPattern = '/^'. $preset .'-[0-9]*$/';
    $customPresets = preg_grep($regexPattern, array_keys(Input::all()));
    $keys = [];
    foreach ($customPresets as $customPreset) 
        array_push($keys, $customPreset);
    
    return $keys;

// This allows me to get all hidden input names in an array in order to get its value from the $request

$hiddenInputs = $this->createValuesKeyArray('hidden-project-name');

一旦我得到这个数组,我就可以做类似的事情,并为 DOM 中的输入文件添加我的规则集:

foreach($hiddenInputs as $hiddenInput)
    $globalRules[$request[$hiddenInput]] = 'required';

不确定这是否是到达那里的正确方法,但它对我有用,而且我不觉得该代码可怕。我会坚持下去,直到找到更好的方法。

【讨论】:

以上是关于Laravel 5.4:动态验证规则的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.4 - 如何为同一个自定义验证规则使用多个错误消息

Laravel 5.4 验证请求,如何处理更新时的唯一验证?

将 jQuery 验证规则添加到动态生成的表单元素时出错

Laravel - 在自定义验证中使用验证规则

Laravel 有时验证规则

Laravel:模型内的验证。多重验证规则