2014-09-04 1 views
3

Je suis désolé d'avoir posé ce genre de question, mais je suis vraiment frustré par se cette situationbonne façon de revenir du modèle au contrôleur

Ceci est mon contrôleur

public function changeName_PUT() { 
    header('Content-Type: application/json'); 

    $return = \Models\User::getCurrent()->changeName(Input::data()); 

    return json_encode($return); 
} 

Et ceci est mon modèle

public function changeName($data){ 
    $rules = array(...); 
    $messages = array(...); 

    $valid = Input::validate($data, $rules, $messages); 

    if($valid === true){ 
     return $this->putIntoDb(array('name' => $data['name'])) ? 'Namechanged successfully.' : 'An error occurred.'; 
    }else{ 
     return $valid->getMessage(); 
    } 
} 

Mon problème est que peu importe si le modèle réussit ou échoue, il y a toujours une chaîne retournée, donc dans le contrôleur, je ne peux pas déterminer si le nom a été changé ou non. Si je retourne seulement true ou false alors dans le contrôleur, si quelque chose a échoué, je ne saurais pas ce que c'était. Mon autre option est de retourner des tableaux du modèle comme array('error', 'message') mais cela semble si moche et me donne l'impression que je me trompe. Pouvez-vous me montrer le bon chemin?

+3

Jeter une exception à partir du modèle ou ajouter un paramètre facultatif [byref] (http://php.net/manual/en/language.references.pass.php) appelé '& $ message' à' changeName' fonctionner sur le modèle? Mieux vaut jeter une exception à mon humble avis. – madebydavid

+0

Il s'agit à peu près de MVC du tout. Il s'agit simplement de savoir comment renvoyer correctement les états d'erreur à partir d'une * fonction *. – deceze

Répondre

1

Vous avez différentes approches:

  • Version simple: Si vous insérez, retournez le inserted_id | false. Si vous supprimez, renvoyez true | false. Si vous mettez à jour, renvoyez true | false. Si vous sélectionnez, renvoyer array | string | false.

  • Version de la classe: Vous renvoyez true ou false (sauf pour select qui renvoie la chaîne interrogée | array). Et vous stockez dans une variable de classe les messages d'erreur afin que vous puissiez faire quelque chose comme:

    $success = $model->query('blabla'); 
    if (!$success) 
        print_r($model->getMessages()); 
    
  • version Objet: Identique à la version simple, sauf que vous retournez l'objet de base de données sur un succès requête de sélection ou mise à jour (sinon faux).

  • Version d'exception: Identique à la version de l'objet, mais au lieu de renvoyer false, vous renvoyez une erreur décrivant le problème.

Maintenant, si vous regardez les cadres communs, vous verrez que CodeIgniter utilise la version d'objet, Phalcon utilise la version de classe, Zend utilise la version d'exception. Il n'y a pas de "best-way", il suffit d'utiliser une méthode et s'en tenir à tous vos modèles.

(Ne renvoyez simplement pas une chaîne qui explique l'erreur sur une requête échouée!

1

La couche du modèle ne doit pas envoyer de données aux contrôleurs.

Dans le modèle architectural MVC, les contrôleurs sont responsables de la modification de l'état de la couche du modèle. Et c'est tout. Afficher les instances puis extraire les informations dont elles ont besoin à partir de cette couche de modèle.

Si, à cause des modifications du contrôleur, un état d'erreur est déclenché dans la couche du modèle, alors le contrôleur ne s'en soucie pas. Cela n'est important que pour la vue qui, selon qu'une erreur s'est produite, peut choisir un ensemble de modèles différent pour l'assemblage de la réponse.

P.S .: les en-têtes HTTP font partie de la réponse. Alors, pourquoi vos "contrôleurs" génèrent-ils une réponse? Ce n'est pas différent de mettre un écho là.

+1

Dans l'exemple actuel, comment suis-je censé savoir quelle erreur s'est produite alors? –

+0

Et généralement, n'est-ce pas le but du modèle, d'aller chercher des données pour le contrôleur? –

+1

Non. En outre, le modèle est une couche et ** pas une classe **. En outre, ce dont vous parlez est une violation claire de la [Loi de Demeter] (http://c2.com/cgi/wiki?LawOfDemeter). –

Questions connexes