2017-05-22 6 views
0

Ich versuche eine benutzerdefinierte Validierungslogik für Dateiuploads für mein Admin-Panel hinzuzufügen. Im Moment können meine Dateifelder entweder Illuminate\Http\UploadedFile oder string|null zurückgeben, wenn die Datei nicht hochgeladen oder geändert wird oder was auch immer. Also, was ich tue, ich eine benutzerdefinierte Regel erstellt, die wie folgt aussieht:Fügen Sie eine benutzerdefinierte bedingte Validierungsregel demselben Attribut hinzu

'image' => [ 
       'required', 
       'admin_file:mimes:jpeg;png,dimensions:min_width=800;min_height=600' 
      ] 

ich dann analysieren alle Argumente i übergeben, und die Sache ist, möchte ich natürlich alle von ihnen nur angewendet, wenn meine Wert ist eine Instanz von UploadedFile. Ich verwende den folgenden Code für meine benutzerdefinierten Validierung:

class AdminFileValidator 
{ 
    public function validate($attribute, $value, $parameters, Validator $validator) 
    { 
     $rules = implode(
      "|", 
      array_map(function($item) { 
       return str_replace(";", ",", $item); 
      }, $parameters) 
     ); 

     $validator->sometimes($attribute, $rules, function() use ($value) { 
      return $value instanceof UploadedFile; 
     }); 

     return true; 
    } 
} 

Das Problem ist, das Hinzufügen zusätzlicher Regeln auf ein Attribut über sometimes nicht so funktioniert, werden diese zusätzlichen Regeln nicht durch einen Validator verarbeitet werden.

Ich möchte fragen, gibt es eine Möglichkeit, diese Regeln zu validieren ohne Revalidierung der ganzen Sache manuell?

+0

Es macht ehrlich keinen Sinn, warum Sie wollen würde, um einen benutzerdefinierten Validator dafür zu erstellen. Laravel kommt mit 'file' Regel, um zu überprüfen, ob die Datei erfolgreich hochgeladen wurde. Es gibt auch Regeln, um es optional zu machen. – Sandeesh

+0

Es gibt viele verschiedene Dateitypen, die ich validieren muss. Wie Dokumente, Bilder, Bilder + PDF und andere. Und die Mime-Regel akzeptiert nur "UploadedFile" -Instanzen und schlägt fehl, wenn die Zeichenfolge übergeben wird (was ich nicht vernünftigerweise vermeiden kann, weil alles in 'FormRequest' verpackt ist). – Eternal1

+0

Sie möchten also, dass ein String-Wert erfolgreich verarbeitet wird Error? Soweit ich sehe, machen die Regeln 'file',' mimetypes', 'mimes' zusammen mit' manchmal' genau das, was Sie brauchen, außer für die String-Toleranz. Ich bin mir nicht sicher, wie Sie eine Zeichenfolge in einer Formulardateieingabe erhalten haben. – Sandeesh

Antwort

0

Was ich sehe, ist, dass Sie sometimes innerhalb einer Regel verwenden. Aus meiner Sicht müssen Sie es herausnehmen, noch besser, ohne eine benutzerdefinierte Klasse zu verwenden.

Mit Validator Objekt:

$validator = Validator::make($data, [ 
    'image' => 'required', 
]); 

$validator->sometimes('image', 'mimes:jpeg;png,dimensions:min_width=800', function($value) { 
    return $value instanceof UploadedFile; 
}); 

Wenn Sie eine Anfrage Klasse verwenden Sie die Funktion getValidatorInstance anwenden, um die bedingten Regeln außer Kraft setzen könnte:

protected function getValidatorInstance(){ 
    $validator = parent::getValidatorInstance(); 

    $validator->sometimes('image', 'mimes:jpeg;png,dimensions:min_width=800', function($value) { 
     return $value instanceof UploadedFile; 
    }); 

    return $validator; 
} 
Verwandte Themen