2017-08-04 5 views
0

Ich bin irgendwie bemüht, die Antwort auf meine Frage zu finden, und mein Test erweist sich nicht als nützlich. Vielleicht hätte jemand hier das gleiche Problem, dem ich gegenüberstehe.Laravel 5.4: Dynamische Validierungsregel

Ich habe Eingänge mit folgenden Art von strukturierten Namen projects-0-1, project-0-2, project-1-0 und so weiter ... Dies sind Dateieingänge so dass die Leute ein Dokument/ein Bild hochladen.

Also im Grunde habe ich versucht, eine Bestätigungsnachricht zu erhalten, die (idealerweise) so etwas wie das sein würde:

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

ODER

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

ich von Dingen versucht ein paar bereits und nichts scheint zu funktionieren.

Der Grund, warum ich eine benutzerdefinierte Nachricht hinzufügen kann, ist, dass die Datei einfach nicht validiert wird, wenn sie für das Objekt $request leer ist. Also muss ich zuerst überprüfen, ob die $request->hasFile und falls nicht, ich möchte die Fehlermeldung hinzufügen.

Dinge zu beachten:

  • Eingänge dynamisch in das Formular eingefügt werden kann, so dass ich weiß nicht, die genaue Anzahl der Dateieingaben ich vorher bestätigen müssen.

  • auch wenn dies den Code und die Validierung nicht beeinflussen sollte, ist es bemerkenswert, dass alles durch Ajax passiert, während ich das Formular auf einer anderen Website einbette. Deshalb habe ich Endpunkte etc ... erstellt.

Irgendwelche Hinweise?

+0

Haben Sie versucht, diese '' Datei. *. Mimen '=>' Nur PDF, JPEG, PNG sind erlaubt. ', 'Https://Stackoverflow.com/a/45188623/5148479 – Hari

+0

Ja, ich habe alles versucht Jazz und es hilft nicht. Ich habe kein Problem mit der Validierung selbst, aber mit übereinstimmenden Fehlermeldungen zu Dateieingaben, wenn diese nicht Teil der Anfrage sind, da sie leer bleiben, wenn das Formular abgeschickt wird. – daneczech

+0

Was im Grunde braucht, ist ich in meinem Regeln Array einen Platzhalter in dem Eingang Namen zu setzen: '$ globalRules = [ ... 'project_documents-0-0' => 'erforderlich | Datei', ... ]; ' ich die letzten Regeln wünsche eine beliebige Zahl zwischen 0-9 nach den Strichen entsprechen zu können .. Also dachte ich, so etwas tun würde: ' ‚project_documents - * - *‘ => 'erforderlich | Datei', 'aber in der Tat nicht .. – daneczech

Antwort

0

Richtig, kommt hier zurück, falls jemand auch dieses Problem hat. Ich fand einen "hacky" Weg, um dorthin zu gelangen und es macht den Trick für mich.

Da jede Eingabedatei dynamisch zum DOM hinzugefügt wird, füge ich eine zusätzliche versteckte Eingabe hinzu, die den Namen der Dateieingabe als Wert enthält.

Da ist in meinem Controller ich smth wie folgt aus:

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');

Sobald ich dieses Array, ich Sachen wie das tun kann und dinamycally meine Reihe von Regeln hinzufügen für die im DOM vorhandenen Eingabedateien:

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

Ich bin mir nicht sicher, ob das der richtige Weg dorthin ist, aber es macht den Job für mich und ich finde diesen Code nicht schrecklich. Ich bleibe dabei, bis ich einen besseren Weg finde.