2014-09-17 2 views
2

J'ai un formulaire d'inscription pour mon client Web et API pour le même formulaire d'inscription. Je veux valider les données de l'API en utilisant les mêmes règles que j'utilise pour le client Web dans le modèle mais je dois afficher des messages différents. Dans le client Web, j'ai des messages comme "'Erreur dans le champ Nom" et pour l'API j'ai besoin d'un message comme "1". Maintenant je fais ceci avec l'instruction if dans le contrôleur, si l'erreur est 'Erreur dans le champ Name', donnez-moi le message '1'. Le problème est que si je dois valider 10 champs, j'ai besoin d'écrire 10 instructions if dans le contrôleur. Y a-t-il une façon plus intelligente de faire cela?CakePHP Validation des messages sur API

Modèle:

class User extends AppModel { 

    public $validate = array(
     'name'=>array(
      'rule'=>'notEmpty', 
      'message'=> ‘Error in field Name’   
     ) 
    ); 
} 

Contrôleur

class RestUsersController extends AppController { 

     $errors = $this->User->invalidFields(); 

     if(array_shift(array_slice($errors, 0, 1))== ' Error in field Name '){ 

      $message='1'; 
     } 
    } 

Merci à l'avance!

Répondre

1

Vous pouvez définir des règles de VALIDATIONS beforeValidation() rappel dans votre modèle. Dans cette méthode, vous pouvez préparer deux tableaux d'ensembles de validation et et mettre une variable AppModel qui va travailler comme commutateur pour choisir ensemble de validation appropriée. Tout ce dont vous avez besoin pour que cela fonctionne fonctionnera en définissant une valeur correcte pour ce commutateur dans votre contrôleur API au rappel beforeFilter(). Pour une meilleure compréhension de ma solution, regardez l'exemple de code ci-dessous.

Modèle

class User extends AppModel { 

    public function beforeValidate($options = array()) { 
     parent::beforeValidate($options); 
     $this->_prepareValidationRules(); 
    } 

    protected function _prepareValidationRules() { 
     if (!empty($this->apiValidation)) { // for API 
      $this->validate = array(
       'name' => array(
        'rule' => 'notEmpty', 
        'message' => 'Error in field Name' 
      )); 
     } else { // default behaviour 
      $this->validate = array(
       'name' => array(
        'rule' => 'notEmpty', 
        'message' => '1' 
      )); 
     } 
    } 
} 

Contrôleur

class RestUsersController extends AppController { 
    public function beforeFilter() { 
     parent::beforeFilter(); 
     $this->User->apiValidation = true; 
    } 
} 

AppModel.php

class AppModel extends Model { 

    public $apiValidation = false; 

    (...) 
} 

Bien sûr, vous pouvez définir $apiValidation variable protégée et CONTROLL par méthode, mais cela est à vous.

+0

Merci @ marian0, fonctionne parfaitement pour mon cas, merci pour votre réponse! – DanielPenkov

Questions connexes