2016-02-04 18 views
7

Sto provando a convalidare un campo password solo se è presente. Voglio consentire a qualcuno di modificare un utente e potrebbero o meno voler cambiare la password dell'utente. Quindi ho pensato che avrei potuto usare le regole di convalida di Laravels, in particolare la regola "a volte". Ho questo insieme di regole:Regola di validazione laravel a volte

$this->validate($request, [ 
    'password' => 'sometimes|required|min:8', 
]); 

Questo è semplificata per l'esempio, ci sarà solitamente altre regole per gli altri campi e regole più severe per la password. Mi aspetto che applichi la regola min: 8 solo se il campo password è presente nei dati passati, ma se lascio il campo password vuoto ricevo un errore di convalida che dice che è richiesto il campo password.

Non sono sicuro di ciò che non sto capendo nei documenti. Devo rimuovere manualmente il campo della password prima della convalida se l'input del modulo è stato inviato vuoto come questo?

$data = $request->all(); 

if ('' === $data['password']) { 
    unset($data['password']) 
} 

... e quindi passare la matrice nel validatore. Penso che questo abbia senso, ma potrei fare con alcune conferme che lo sto capendo correttamente. Grazie in anticipo.

+0

Dalla documenti, questo è quello che capisco. Quindi, fondamentalmente sei a posto, a meno che qualcuno non dica altrimenti. –

+0

Sembra anche che se si rimuove la regola richiesta, funziona bene così: 'a volte | min: 8 .....', ma i documenti non lo rendono chiaro. – Steven1978

+0

Sì. è quello che ho pensato prima, poi ho controllato di nuovo i documenti. : D –

risposta

6

I documenti non sono chiari, ma la rimozione richiesta lo rende funzionante.

$this->validate($request, [ 
    'password' => 'sometimes|min:8', 
]); 
+0

Sembra ovvio, ma i documenti ti indirizzano lontano dalla soluzione. Grazie per l'aiuto :). – Steven1978

+0

Sì, l'ho fatto sul codice ma mi sono confuso vedendo i documenti. lieto di poter aiutare :) –

+0

Lo capisco bene? La regola a volte significa che l'input è facoltativo? – TheCrazyProfessor

10

Penso che dovremmo dirlo a laravel Se la password non è vuota, mettere le regole altrimenti non fare nulla.

$this->validate($request, [ 
    'password' => $request->password != null ?'sometimes|required|min:8': '' 
]); 
+0

"Nell'esempio sopra, il campo della password verrà convalidato solo se è presente nell'array $ dati". dai documenti –

+0

@nbin Puoi fare riferimento? –

+0

potresti vedere i documenti? –

3

Penso che in genere sia più sicuro consentire all'utente di modificare la propria password solo se è in grado di fornire quello vecchio.

Consentire all'utente connesso di modificare la sua password senza fornire quella precedente può essere un problema di sicurezza.

Questo è generalmente come mi permetto di modifica della password dell'utente con laravel:

$this->validate($request, [ 
      'user.old_password' => [], 
      'user.password' => [ 
       'required_with:user.old_password', 
       'min:6', 
       'confirmed', 
       'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*([[email protected]#$%^&*.,;?])).+$/', 
       'different:user.old_password' 
      ], 
      'user.password_confirmation' => ['required_with:user.password'], 
     ]); 

Questo non convalidano la vecchia password, come non ci interessa, il database controllerà per noi, ma io convalidare la nuova password solo se viene fornita quella vecchia.

2

In modalità di modifica si riempie campo password, ad esempio, "********" e in modalità di aggiornamento convalidare come questo

$this->validate($request, [ 
    'password' => 'required|min:8', 
]); 

e sotto controllo regolatore $data['password']='********' trovare vecchia password e

$data['password']='old password in db' 

e $data['password']!='********' aggiornamento pssword