2017-08-04 100 views
0

我很难找到我的问题的答案,而我的测试没有证明是有用的。所以也许这里有人会遇到我面临的同样的问题。Laravel 5.4:动态验证规则

我有以下种图案名称输入projects-0-1project-0-2project-1-0等等...... 这些文件输入,使人们可以上传文档和/或图像。

所以基本上,我一直试图让会(理想)是类似的东西验证消息:

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

OR

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

我试了几件事情已经和似乎没有任何工作。

我得到添加自定义消息的原因是该文件仅在$request对象为空时根本未验证。所以我首先需要检查$request->hasFile是否和我不想添加错误信息。

需要考虑的事情:

  • 输入可动态添加到形式,所以我不知道我需要事先验证文件输入的确切人数。

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

任何提示?

+0

你试过像这个''file。*。mimes'=>'只允许PDF,JPEG,PNG。','https://stackoverflow.com/a/45188623/5148479 – Hari

+0

是的,我尝试了所有爵士乐,它并没有帮助。我没有验证本身的问题,但是当它们不是请求的一部分时,将错误消息与文件输入相匹配,因为当表单提交时它们保持为空。 – daneczech

+0

我基本上需要的是把一个通配符输入名字在我的规则阵列: '$ globalRules = [ ... 'project_documents-0-0'=> '需要|文件', ... ]' 我希望最后的规则,能够在破折号后0-9之间匹配任意数量的.. 因此,我认为这样的事情会做: '“project_documents - * - *” => 'required | file','但的确不是。 – daneczech

回答

0

对,如果有人也面临这个问题,回到这里。我发现了一个“哈克”的方式来到那里,它为我做了诡计。

由于每个输入文件都是动态添加到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');

一旦我得到这个数组,我可以做类似的东西和dinamycally加我的一套规则对于存在于DOM中的输入文件:

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

不知道这是否是正确的方式,但它为我做了这项工作,而且我没有发现可怕的代码。我会坚持下去,直到找到更好的方式。