[Php] Comment un modèle doit-il être structuré en MVC?


Answers

Tout ce qui est la logique métier appartient à un modèle, qu'il s'agisse d'une requête de base de données, de calculs, d'un appel REST, etc.

Vous pouvez avoir l'accès aux données dans le modèle lui-même, le modèle MVC ne vous en empêche pas. Vous pouvez le badigeonner de services, de mappeurs et de quoi d'autre, mais la définition même d'un modèle est une couche qui gère la logique métier, rien de plus, rien de moins. Ce peut être une classe, une fonction ou un module complet avec un objet gazillion si c'est ce que vous voulez.

Il est toujours plus facile d'avoir un objet séparé qui exécute réellement les requêtes de base de données au lieu de les exécuter directement dans le modèle: cela sera particulièrement utile lors des tests unitaires (en raison de la facilité d'injection d'une dépendance de base de données).

class Database {
   protected $_conn;

   public function __construct($connection) {
       $this->_conn = $connection;
   }

   public function ExecuteObject($sql, $data) {
       // stuff
   }
}

abstract class Model {
   protected $_db;

   public function __construct(Database $db) {
       $this->_db = $db;
   }
}

class User extends Model {
   public function CheckUsername($username) {
       // ...
       $sql = "SELECT Username FROM" . $this->usersTableName . " WHERE ...";
       return $this->_db->ExecuteObject($sql, $data);
   }
}

$db = new Database($conn);
$model = new User($db);
$model->CheckUsername('foo');

De plus, en PHP, vous avez rarement besoin d'attraper / de relancer des exceptions car le backtrace est préservé, en particulier dans un cas comme votre exemple. Laissez simplement l'exception être lancée et attrapez-la dans le contrôleur à la place.

Question

Je commence juste à comprendre le framework MVC et je me demande souvent quelle quantité de code devrait être dans le modèle. J'ai tendance à avoir une classe d'accès aux données qui a des méthodes comme celle-ci:

public function CheckUsername($connection, $username)
{
    try
    {
        $data = array();
        $data['Username'] = $username;

        //// SQL
        $sql = "SELECT Username FROM" . $this->usersTableName . " WHERE Username = :Username";

        //// Execute statement
        return $this->ExecuteObject($connection, $sql, $data);
    }
    catch(Exception $e)
    {
        throw $e;
    }
}

Mes modèles ont tendance à être une classe d'entité mappée à la table de base de données.

L'objet de modèle doit-il avoir toutes les propriétés mappées de la base de données ainsi que le code ci-dessus ou est-il correct de séparer ce code de la base de données?

Vais-je finir par avoir quatre couches?




Plus souvent la plupart des applications auront des données, l'affichage et le traitement des pièces et nous mettons simplement tous ceux qui sont dans les lettres M , V et C

Model ( M ) -> A les attributs qui contiennent l'état d'application et il ne sait rien à propos de V et C

Voir ( V ) -> A le format d'affichage pour l'application et et ne sait que sur comment modéliser dessus et ne se soucie pas de C

Le contrôleur ( C ) ----> A le traitement de la partie de l'application et agit comme un câblage entre M et V et il dépend à la fois de M , V contrairement à M et V

Au total, il y a une séparation des préoccupations entre chacun. À l'avenir, tout changement ou amélioration peut être ajouté très facilement.