2015-05-09 7 views
6

Non riesco a capire come modificare una regola di convalida al volo, ad esempio nel mio controller.CakePHP 3.x: come modificare una regola di convalida al volo

Il mio caso: la tabella "utenti" ha il campo "email", il cui valore deve essere "univoco" durante la creazione e l'aggiornamento. Per ora va bene, ho creato le regole di validazione corrette.

Ma ora devo creare un'azione che consenta agli utenti di recuperare la propria password. Quindi c'è un modulo in cui gli utenti inseriscono il loro indirizzo email e questo modulo deve essere convalidato. Dopo, l'azione controlla se c'è quell'indirizzo e-mail e invia una e-mail per reimpostare la password.

Quindi: devo convalidare il modulo con le regole di convalida, ma in questo caso particolare non ho bisogno che l'email sia "unica".

Come modificare la regola di convalida solo per un'azione?

Grazie.


EDIT

Forse questo?

class UsersTable extends Table { 
    public function validationDefault(\Cake\Validation\Validator $validator) {  
     //Some rules... 

     $validator->add('email', [ 
      'unique' => [ 
       'message' => 'This value is already used', 
       'provider' => 'table', 
       'rule'  => 'validateUnique' 
      ] 
     ]); 

     //Some rules... 

     return $validator; 
    } 

    public function validationOnlyCheck(\Cake\Validation\Validator $validator) { 
     $validator->remove('email', 'unique'); 

     return $validator; 
    } 
} 

Nella mia azione:

$user = $this->Users->newEntity($this->request->data(), [ 
    'validate' => 'OnlyCheck' 
]); 
+1

Per me che suona come se si dovrebbe usare un validatore a parte, in quanto si tratta solo di un singolo campo che non è nemmeno ment per essere salvato? – ndm

+0

Grazie a @ndm, forse posso farlo: per questo caso specifico, utilizzo un nuovo validatore che estende quello originale ('UserOnlyCheckValidator estende UserValidator'). Nel nuovo validatore, ho solo [cancella] (http://api.cakephp.org/3.0/class-Cake.Validation.Validator.html#_remove) quella regola. Cosa ne pensi? –

+0

@ndm, guarda il mio ultimo montaggio –

risposta

7

Quello che hai nella tua domanda dopo la modifica è il modo in cui previsto CakePHP 3 consente di utilizzare diverse regole di validazione/dinamici per caso d'uso.

use Cake\Validation\Validator; 
class UsersTable extends Table { 
    public function validationDefault(Validator $validator) {  
     //Some rules... 

     $validator->add('email', [ 
      'unique' => [ 
       'message' => 'This value is already used', 
       'provider' => 'table', 
       'rule'  => 'validateUnique' 
      ] 
     ]); 

     //Some rules... 

     return $validator; 
    } 

    public function validationOnlyCheck(Validator $validator) { 
     $validator = $this->validationDefault($validator); 
     $validator->remove('email', 'unique'); 
     return $validator; 
    } 
} 

E poi:

$user = $this->Users->newEntity($this->request->data(), [ 
    'validate' => 'OnlyCheck' 
]); 
+0

fantastico! lavoro come fascino !! –