Je sais qu'en POO, vous voulez que chaque objet (d'une classe) soit une "chose", par exemple. utilisateur, validateur, etc.
Je connais les bases de MVC, comment les différentes parties interagissent les unes avec les autres.
Cependant, je me demande si les modèles dans MVC devraient être conçus selon la conception traditionnelle de la POO, c'est-à-dire, chaque modèle devrait-il être une base de données/table/ligne (solution 2) ?
Ou est-ce que l'intention est plutôt de collecter des méthodes qui affectent la même table ou un groupe de tables liées (solution 1).
Exemple pour un module de carnet d'adresses dans CodeIgniter, où je veux pouvoir "CRUD" un contact et l'ajouter/supprimer à/d'un groupe de contacts CRUD-able.
Solution des modèles 1 : regrouper toutes les méthodes associées (pas un objet réel, plutôt un "paquet")
class Contacts extends Model {
function create_contact() {)
function read_contact() {}
function update_contact() {}
function delete_contact() {}
function add_contact_to_group() {}
function delete_contact_from_group() {}
function create_group() {}
function read_group() {}
function update_group() {}
function delete_group() {}
}
Solution de modèles 2 : la méthode OOP (une classe par fichier)
class Contact extends Model {
private $name = '';
private $id = '';
function create_contact() {)
function read_contact() {}
function update_contact() {}
function delete_contact() {}
}
class ContactGroup extends Model {
private $name = '';
private $id = '';
function add_contact_to_group() {}
function delete_contact_from_group() {}
function create_group() {}
function read_group() {}
function update_group() {}
function delete_group() {}
}
Je ne sais pas comment penser quand je veux créer les modèles. et les exemples ci-dessus sont mes vraies tâches pour créer un carnet d'adresses. Dois-je simplement regrouper toutes les fonctions dans une seule classe. alors la classe contient une logique différente (contact et groupe), elle ne peut donc pas contenir de propriétés spécifiques à l'un ou l'autre.
La solution 2 fonctionne selon la POO. mais je ne sais pas pourquoi je devrais faire une telle division. quels seraient les avantages d'avoir un objet Contact par exemple. Ce n'est sûrement pas un objet User, alors pourquoi un contact devrait-il "vivre" avec son propre état (propriétés et méthodes). Parce que j'ai tendance à penser comme ceci : si quelque chose a besoin d'un état, alors je crée une classe OOP afin que les méthodes puissent affecter l'état ou d'autres choses basées sur l'état.
Les modèles devraient-ils donc aussi être « avec état » ? s'ils ne nécessitent aucun état, pourquoi devrais-je le créer selon le modèle OOP. alors je pourrais simplement tout regrouper comme la solution "package".
Vous avez connu des gars avec la POO/MVC, veuillez nous éclairer sur la façon dont il faut penser ici dans cette tâche très concrète (et en général lors de la création d'un modèle)
EDIT : pensez aux contrôleurs dans MVC. ils sont créés selon la solution « package ». Ça me fait penser...
3 réponses
chaque modèle devrait-il être une base de données/table/ligne (solution 2) ?
Non. Ne liez pas la définition d'un modèle à sa méthode de persistance. Bien que pour des applications simples, vous puissiez étendre un modèle à partir d'un objet de ligne de base de données, vous devez les garder au moins mentalement séparés.
Les modèles sont simplement des représentations d'entités dans votre domaine, donc par nécessité, ils ont un état. Là où vous parlez d'un modèle de contact, vous parlez en réalité d'un mappeur ou d'une passerelle, c'est-à-dire de l'objet récupérant votre modèle du magasin de données. Il est regrettable que tant d'implémentations ad hoc d'Active Record aient brouillé les pistes à ce sujet.
Les mappeurs peuvent être implémentés en tant que collection de fonctions statiques ou en tant qu'objet - cependant, la collection est moins flexible si vous souhaitez étendre ou modifier le comportement pour une raison quelconque (comme la moquerie pour les tests unitaires).
Le modèle lui-même doit simplement être une collection de données, soit stockées en tant que propriétés publiques, soit de préférence avec des setters et getters appropriés (veuillez ne pas simplement définir une paire de fonctions get/set pour chaque variable ou vous pourriez aussi laissez-les simplement publics), ainsi que d'autres méthodes qui fonctionnent sur les données. Il ne doit pas avoir de concept ni de dépendance vis-à-vis du magasin de données. Il est de la responsabilité du mappeur d'instancier et d'initialiser le modèle via son interface. Cela vous donnera une flexibilité dans la façon dont vous pouvez créer et enregistrer vos modèles. Vous pouvez le faire à partir de la base de données, d'un fichier XML, dans le code, à partir d'un flux sérialisé envoyé sur le réseau, tout ce qui flotte vraiment sur votre bateau, le tout en substituant un mappeur différent, et le modèle reste complètement inconscient.
Je ne sais pas s'il existe une meilleure méthode, mais je vais partager ma façon de procéder...
J'ai une passerelle de table, par ex. ContactTableGateway qui contient tout le SQL pour traiter les contacts. J'aime que tout le SQL soit au même endroit.
class ContactTableGateway extends Model {
function saveContact( Contact $contact )
function getContact ( $contact_id )
function createContact ( Contact $contact )
}
Ensuite, j'ai une classe de contact qui n'a essentiellement que des getters et des setters (ou des propriétés publiques). Les objets de cette classe sont utilisés comme arguments pour que la passerelle de table enregistre/crée
class Contact extends Model {
function getName()
function getAddress()
function getEmail()
....
}
Voici un exemple simplifié
if ( isset( $_POST ) ) {
// some validation here
$contact = new Contact;
$contact->name = $_POST['name'];
$contact->email = $_POST['email']
$contactTableGateway = new ContactTableGateway;
if ( $contactTableGateway->createContact( $contact ) ) {
echo "YAY";
}
}
ContactTableGateway
est chargé de communiquer avec la base de données et Contact
est un objet ? Pourquoi tous doivent-ils étendre la classe Model ? Pour utiliser l'objet $db ?
Je pense que votre solution n°2 est supérieure car elle est plus moléculaire/modulaire, donc plus compréhensible, flexible et extensible (dans le domaine de la POO). Il est également plus convivial en ressources car il pourrait vous permettre de n'avoir à charger la classe Contact que lorsqu'aucune fonctionnalité de groupe de contacts n'est requise et vice-versa. C'est l'avantage de la division.
Si les modèles n'ont pas besoin d'état, cela ne signifie pas que OOP/MVC ne s'applique pas. Les modèles de table peuvent n'avoir aucun état dans leur conception, mais c'est pourquoi nous avons des méthodes/membres statiques, c'est-à-dire Contact::read($id).
Questions connexes
De nouvelles questions
php
PHP est un langage de script largement utilisé, de haut niveau, dynamique, orienté objet et interprété, principalement conçu pour le développement Web côté serveur. Utilisé pour les questions sur le langage PHP.