Laravel 5.4:动态验证规则
Posted
技术标签:
【中文标题】Laravel 5.4:动态验证规则【英文标题】:Laravel 5.4 : Dynamic validation rule 【发布时间】:2018-01-12 05:54:30 【问题描述】:我很难找到问题的答案,而且我的测试并没有被证明是有用的。所以也许这里有人会遇到我面临的同样问题。
我的输入具有以下类型的模式名称projects-0-1
、project-0-2
、project-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 - 如何为同一个自定义验证规则使用多个错误消息