2017-01-04 5 views
1

Ich erstelle Validierung (über FormRequest) für meine API und ich muss den Statuscode in Abhängigkeit von fehlgeschlagenen Validierungsregel ändern (z. B. ID ist String statt Int, 400 erhalten. Wenn ID existiert nicht, bekomme 404).Laravel FormRequest Antwort Statuscode bei fehlgeschlagener Validierung

wollte ich so etwas schreiben:

/** 
* Get the proper failed validation response for the request. 
* 
* @param array $errors 
* @return \Symfony\Component\HttpFoundation\Response 
*/ 
public function response(array $errors) 
{ 
    $failedRules = $this->getValidatorInstance()->failed(); 

    $statusCode = 400; 
    if (isset($failedRules['id']['Exists'])) $statusCode = 404; 

    return response($errors, $statusCode); 
} 

jedoch $ this-> getValidatorInstance() -> fehlgeschlagen() gibt leeres Array

  • Warum $ this-> getValidatorInstance () -> gescheitert leeres Array zurückgeben?
  • Wie kann ich das beheben? Gibt es eine andere Möglichkeit, den Statuscode abhängig von der fehlgeschlagenen Validierungsregel zurückzugeben?
+0

Welche Version von Laravel verwenden Sie? –

+0

Ich benutze Laravel 5.3 – Ivan

Antwort

1

Der Grund Sie ein leeres Array bekommen, wenn Ihr Anruf $this->getValidatorInstance()->failed() ist, weil es eine neue Instanz von Validator Lösung tatsächlich ist.

Was können Sie tun, ist Aufruf passes() auf dem neuen Validator Instanz, die dann erlauben Sie failed() zu nennen, die Regeln zu bekommen:

$validator = $this->getValidatorInstance(); 
$validator->passes(); 
$failedRules = $validator->failed(); 

Alternativ, wenn Sie nicht zweimal den Validator ausgeführt haben wollen Sie könnten die failedValidation Methode überschreiben, die Validation Instanz in der Klasse zu speichern:

protected $currentValidator; 

protected function failedValidation(Validator $validator) 
{ 
    $this->currentValidator = $validator; 

    throw new ValidationException($validator, $this->response(
     $this->formatErrors($validator) 
    )); 
} 

public function response(array $errors) 
{ 
    $failedRules = $this->currentValidator->failed(); 

    $statusCode = 400; 
    if (isset($failedRules['id']['Exists'])) $statusCode = 404; 

    return response($errors, $statusCode); 
} 

hoffe, das hilft!

+0

Ja, ich kann das tun, aber in diesem Fall validiere ich Daten zweimal, so dass es mir nicht hilft – Ivan

+0

@Ivan Ich habe meine Antwort aktualisiert. –

+0

Ich kann das nicht tun, bcs Ich bekomme "Declaration of ... GetUser :: Antwort (Array $ Fehler, $ Validator) sollte kompatibel sein mit ... FormRequest :: Antwort (Array $ Fehler)" Mindestens Ich werde meine eigene Klasse erstellen. Kannst du mir sagen, wie ich das machen soll? Ich meine, wo soll ich es schaffen? Ich dachte, ich kann Facade erstellen, aber ich kann das nicht tun oder Docs sagt nichts darüber :) – Ivan

Verwandte Themen