2014-11-14 13 views
5

FormRequests in Laravel 5 è un buon approccio per la convalida e l'autorizzazione. Ma come procedere se devo convalidare la richiesta che contiene dati per una relazione uno a molti. Ad esempio se ho un'app fattura semplice. Una fattura ha molti servizi. mio modulo di richiesta POST contiene questi dati:Laravel 5 richieste modulo - convalida dati correlati

array (size=5) 
    'date' => string '2014-11-14' (length=10) 
    'num' => string '175' (length=3) 
    'client_id' => string '5' (length=1) 
    'vat' => string '1' (length=1) 
    'services' => 
    array (size=2) 
     0 => 
     array (size=3) 
      'description' => string 'Service 1' (length=36) 
      'value' => string '10' (length=2) 
      'items' => string '2' (length=1) 
     1 => 
     array (size=3) 
      'description' => string 'Service 2' (length=11) 
      'value' => string '20' (length=2) 
      'items' => string '2' (length=1) 

Ora in classe InvoiceFormRequest posso convalidare i dati della fattura, ma come procedere con i servizi:

<?php namespace App\Http\Requests; 

use Illuminate\Foundation\Http\FormRequest; 
use Response; 

class InvoiceFormRequest extends FormRequest 
{ 
    public function rules() 
    { 
     return [ 
      'date' => 'required', 
      'num' => 'required', 
      'client_id' => 'required', 
      'vat' => 'required' 
     ]; 
    } 

    public function authorize() 
    { 
     return true; 
    } 
} 

Grazie in anticipo!


Aggiornamento: Come ho letto in here laravel 5.2 sarà in grado di scrivere qualcosa del genere:

'services.*.description' => 'required', 
'services.*.value' => 'required:numeric', 
'services.*.items' => 'required:integer' 
+0

È necessario utilizzare un validatore personalizzato. Vedi [this] (http://stackoverflow.com/a/26616023/397195) se vuoi il tuo validatore personalizzato all'interno di 'FormRequest'. – Marwelln

+0

L'aggiornamento dovrebbe essere una risposta. – whoan

+0

Sì, lo farò. Ora è un dato di fatto. Laravel 5.2 appena rilasciato. – fireball70

risposta

1

Si potrebbe utilizzare l'opzione "allineamento" per i "servizi" Parametri nelle regole, ma ovviamente ciò non convaliderebbe alcun dato contenuto in ciascun elemento.

http://laravel.com/docs/master/validation#rule-array

Quindi, probabilmente sarei suggerisco di usare qualcosa come Marwelln ha detto, con un validatore personalizzato, così come la regola "allineamento".

Le regole sarebbe probabilmente finire per assomigliare questo

public function rules() 
{ 
    return [ 
     'date' => 'required', 
     'num' => 'required', 
     'client_id' => 'required', 
     'vat' => 'required', 
     'services' => 'array|services' 
    ]; 
} 

e il validatore personalizzato potrebbe essere qualcosa di simile (si dovrebbe mettere questo in un ServiceProvider)

Validator::extend('services', function($attribute, $value, $parameters) 
{ 

    //foreach $value as $service 
      //validate $service['description'], $service['value'], $service['items'] 

    //return true or false depending on the validation of each element 
}); 

spero che ti ha aiutato a trova la giusta direzione!