2016-06-20 23 views
5

Ho un modulo e ho una matrice di campi di input per gli URL video, ora quando convalido il modulo se ho più campi non validi con URL video, ottengo lo stesso messaggio per ciascuno dei campo non valido, dal momento che ho creato i miei messaggi personalizzati. Non voglio per ogni campo di input lo stesso messaggio di errore e non voglio i messaggi di errore Laravel predefiniti per le matrici in cui il nome del campo è mostrato con il messaggio di errore, invece di quello, vorrei avere i messaggi di errore con il valore, in questo caso url scritto dall'utente. Come farlo?Messaggi personalizzati Laravel per convalida array

Questo è il mio file di richiesta con i messaggi e le regole:

public function messages(){ 

    $messages = [ 
     'title.required' => 'Du må ha tittel.', 
     'type.required' => 'Du må velge artikkeltype.', 
     'category.required' => 'Du må velge kategori.', 
     'summary.required' => 'Du må ha inngress.', 
     'text.required' => 'Du må ha artikkeltekst.', 
     'active_url' => 'Du må ha gyldig url.', 
    ]; 
    } 

    public function rules(){ 

    $rules = [ 
     'external_media.*' => 'active_url', 
     'title' => 'required', 
     'type' => 'required', 
     'category' => 'required', 
     'summary' => 'required', 
     'text' => 'required', 
     //'image' => 'required|image|max:20000', 
    ]; 

    return $rules; 

    } 

codice aggiornato per rendere la questione più chiara

Quando ho il mio file di richiesta in questo modo:

public function messages(){ 

    $messages = [ 
     'title.required' => 'Du må ha tittel.', 
     'type.required' => 'Du må velge artikkeltype.', 
     'category.required' => 'Du må velge kategori.', 
     'summary.required' => 'Du må ha inngress.', 
     'text.required' => 'Du må ha artikkeltekst.', 
     'external_media.active_url' => 'Du må ha gyldig url.', 
    ]; 

    return $messages; 
    } 

    public function rules(){ 

    $rules = [ 
     'external_media.*' => 'active_url', 
     'title' => 'required', 
     'type' => 'required', 
     'category' => 'required', 
     'summary' => 'required', 
     'text' => 'required', 
     //'image' => 'required|image|max:20000', 
    ]; 

    return $rules; 

    } 

Ottengo l'output:

The external_media.0 is not a valid URL. 
The external_media.1 is not a valid URL. 
The external_media.2 is not a valid URL. 

Invece di quel tipo di uscita vorrei prendere il valore per ciascuno di questi ingressi e avere qualcosa di simile:

The htt:/asdfas.com is not a valid URL. 

risposta

-1

È possibile utilizzare come

$messages = [ 
    'title.required' => 'Du må ha tittel.', 
    'type.required' => 'Du må velge artikkeltype.', 
    'category.required' => 'Du må velge kategori.', 
    'summary.required' => 'Du må ha inngress.', 
    'text.required' => 'Du må ha artikkeltekst.', 
    'active_url' => 'Du må ha gyldig url.', 
]; 

$validator = Validator::make($data, [ 
    'external_media.*' => 'active_url', 
    'title' => 'required', 
    'type' => 'required', 
    'category' => 'required', 
    'summary' => 'required', 
    'text' => 'required', 
    //'image' => 'required|image|max:20000' 
], $messages); 

if ($validator->fails()){ 
    // handle validation error 
} else { 
    // no validation error found 
} 
2

di utilizzare un messaggi personalizzati dall'esterno il file della lingua di convalida, è possibile utilizzare in questo modo:

$messages = ['username.required' => 'customeError']; 

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

si può semplicemente passare un array di messaggi personalizzati come esimo e terzo parametro come l'ho usato sopra. Spero che questo ti aiuti.

0

Modifica con potenziale soluzione

Dopo un po 'di scavo intorno, ho avuto uno sguardo alla classe di Validator e come si sta aggiungendo è messaggi di errore per vedere se ha qualche segnaposto disponibili.

Nel Illuminate\Validation\Validator la funzione che penso venga eseguita per convalidare una richiesta è validate, che esegue a turno ciascuna delle regole e aggiunge messaggi di errore. Il pezzo di codice relativo all'aggiunta di un messaggio di errore è questo, alla fine della funzione:

$value = $this->getValue($attribute); 

    $validatable = $this->isValidatable($rule, $attribute, $value); 

    $method = "validate{$rule}"; 

    if ($validatable && ! $this->$method($attribute, $value, $parameters, $this)) { 
     $this->addFailure($attribute, $rule, $parameters); 
    } 

Come si può vedere, non è in realtà che passa il valore del campo che è stato convalidato attraverso quando è l'aggiunta di un fallimento, che a sua volta aggiunge un messaggio di errore.

Sono riuscito a ottenere qualcosa lavorando per ottenere quello che stai cercando.Se si aggiungono questi due metodi nella vostra classe base Request che è di solito a App\Http\Requests\Request:

protected function formatErrors(Validator $validator) 
{ 
    $errors = parent::formatErrors($validator); 

    foreach ($errors as $attribute => $eachError) { 
     foreach ($eachError as $key => $error) { 
      if (strpos($error, ':value') !== false) { 
       $errors[$attribute][$key] = str_replace(':value', $this->getValueByAttribute($attribute), $error); 
      } 
     } 
    } 

    return $errors; 
} 

protected function getValueByAttribute($attribute) 
{ 
    if (($dotPosition = strpos($attribute, '.')) !== false) { 
     $name = substr($attribute, 0, $dotPosition); 
     $index = substr($attribute, $dotPosition + 1); 

     return $this->get($name)[$index]; 
    } 

    return $this->get($attribute); 
} 

Poi nei tuoi messaggi di convalida che si dovrebbe essere in grado di mettere il :value sostituto, che dovrebbe essere sostituito con il valore effettivo che è stato convalidato , in questo modo:

public function messages() 
{ 
    return [ 
     'external_media.*.active_url' => 'The URL :value is not valid' 
    ]; 
} 

ho notato un paio di problemi con il tuo codice:

  • Nella tua funzione messages hai fornito un messaggio per active_url che è il nome della regola, piuttosto che il nome del campo. Questo dovrebbe essere external_media.
  • Non si sta restituendo la variabile $messages dalla funzione messages. È necessario aggiungere return $messages; fino alla fine.

Per quanto riguarda la tua domanda però, la classe in cui si scrive questo codice è un'istanza di Illuminate\Http\Request e si dovrebbe essere in grado di accedere ai valori reali forniti a tale richiesta quando si generano i messaggi di errore. Ad esempio, si potrebbe fare qualcosa di simile:

public function messages() 
{ 
    return [ 
     'external_media' => 'The following URL is invalid: ' . $this->get('external_media') 
    ]; 
} 

public function rules() 
{ 
    return [ 
     'external_media' => 'active_url' 
    ]; 
} 

che dovrebbe includere il valore fornito al external_media nel messaggio di errore. Spero che questo ti aiuti.

+0

quando lo faccio come da te suggerito tanto sono errore: Array alla conversione stringa – Marco

+0

Oh giusto, credo di capire ora. Non credo sia possibile - aggiornerò la mia risposta – Jonathon

+0

Sei sulla strada giusta. Controlla il mio commento per la soluzione di lavoro – smo0f

2
public function messages() { 

    $messages = [ 
     'title.required' => 'Du må ha tittel.', 
     'type.required'  => 'Du må velge artikkeltype.', 
     'category.required' => 'Du må velge kategori.', 
     'summary.required' => 'Du må ha inngress.', 
     'text.required'  => 'Du må ha artikkeltekst.', 

    ]; 

    foreach ($this->get('external_media') as $key => $val) { 
     $messages["external_media.$key.active_url"] = "$val is not a valid active url"; 
    } 

    return $messages; 

} 
0

Penso che questo ti aiuterà se stai usando "nome = posizione []" nella tua pagina di visualizzazione.

for ($i = 0; $i <= sizeof($location); $i++) { 
$this->validate($request, 
[ 
// set the rules 
    'location.'.$i => 'required', 
    'contact_no.'.$i => 'required', 
    'email.'.$i => 'required|email', 
], 
[ 
// set your custom error messages here 
    'location.'.$i.'.'.'required' => 'Contact no. is required', 
    'contact_no.'.$i.'.'.'required' => 'Contact no. is required', 
    'email.'.$i.'.'.'required' => 'Email is required', 
    'email.'.$i.'.'.'email' => 'Please enter valid email address' 
]); 
} 
2
public function messages() 
     { 
      $messages = []; 
      foreach ($this->request->get('external_media') as $key => $val) { 
       $messages['external_media.' . $key . '.active_url'] = 'The '.$val .' is not a valid URL.' 
      } 
      return $messages; 
     } 
0

È possibile utilizzare Customizing The Error Format

protected function formatErrors(Validator $validator) 
{ 
    $results = []; 
    $flag = false; 
    $messages = $validator->errors()->messages(); 
    foreach ($messages as $key => $value) { 
     if (!str_contains($key, 'external_media') || !$flag) { 
      $results[] = $value[0]; 
     } 
     if (str_contains($key, 'external_media') && !$flag) { 
      $flag = true; 
     } 
    } 
    return $results; 
}