8
votes

À quoi ressemble une mappeuse de données?

J'ai une table appelée chat et une classe PHP appelée chat . Maintenant, je veux faire une classe CatDatamapper , de sorte que CAT étend CATDataMapper .

Je souhaite que la classe de mappeuse de données fournisse une fonctionnalité de base pour faire orm, et pour la création, la modification et la suppression de chat.

À cette fin, une personne qui sait très bien que ce modèle pourrait très bien me donner des conseils utiles? Je pense que ce serait un peu trop simple pour offrir des fonctions telles que Mettre à jour (), Supprimer (), Sauvegarder ().

Je réalise qu'un mappeur de données a ce problème: vous créez d'abord l'instance de chat, puis initialisez toutes les variables telles que le nom, le furcolor, l'oeecolor, les piqueurs de piqueurs, les rencontres, etc. et après que tout soit configuré, vous appelez. la fonction SAVE () qui est héritée de CatDatamapper. C'était simple;) Mais maintenant, le vrai problème: vous interrogeez la base de données pour les chats et récupérez un résultat unie des résultats ennuyeux avec beaucoup de données de CATS.

PDO présente une certaine capacité d'orje pour créer des cas de chat. Disons que j'utilise cela, ou laissez même dire que j'ai une fonction MapDataSet () qui prend une matrice associative. Cependant, dès que j'ai obtenu mon objet CAT d'un ensemble de données, j'ai des données redondantes. Dans le même temps, vingt utilisateurs pourraient récupérer les mêmes données CAT de la base de données et modifier l'objet CAT, c'est-à-dire renommer le chat et sauvegarder (). Lorsque tous sauve leurs modifications, tout est gâché.

err ... OK, pour garder cette question vraiment courte: qu'est-ce que la bonne pratique ici?


0 commentaires

5 Réponses :


0
votes

Gardez la réponse courte: Vous avez une instance de chat. (Peut-être qu'il étend CATDBMAPPER, ou CAT3RDPARTYCATSTOREMAPPER) Vous appelez:

$cats = $cat_model->getBlueEyedCats();
//then you get an array of Cat objects, in the $cats array


1 commentaires

Je pense que vous avez décrit ActiveCord, pas Datamapper.



2
votes

Si vous comptez sur ORM comme DOCTRINE ou propul , le principe de base consiste à créer une classe statique qui obtiendrait les données réelles de la base de données (par exemple propulde créerait CATPEER), et Les résultats récupérés par la classe de pairs seraient alors "hydratés" dans des objets de chat.

Le processus d'hydratation est le processus de conversion d'un résultat MySQL "uni Boring" dans de jolis objets ayant des getters et des setters.

Donc pour une extraction que vous utiliseriez quelque chose comme Catpeer :: Doselect () . Ensuite, pour un nouvel objet, vous l'instanciez d'abord (ou récupérez-le de la DB): $ cat = nouveau chat ();

L'insertion serait aussi simple que: $ cat-> sauvegarder (); ce serait équivalent à un insertion (ou une mise à jour si l'objet existe déjà dans la DB ... L'ORM devrait savoir comment faire la différence entre les objets nouveaux et les objets existants à l'aide, par exemple, la présence d'une absence d'une clé primaire).


0 commentaires

12
votes

de Datamapper à PoEa

Le mappeur de données est une couche de logiciel qui sépare les objets en mémoire de la base de données. Sa responsabilité est de transférer des données entre les deux et aussi pour les isoler de chaque autre. Avec des données mapper la mémoire les objets n'ont pas besoin de savoir même qu'il y a une base de données présente; ils n'ont pas besoin de SQL code d'interface, et certainement non connaissance du schéma de base de données. (Les Le schéma de la base de données est toujours ignorant de les objets qui l'utilisent.) Puisque c'est un forme de mapper (473), mappeuse de données lui-même est même inconnu du domaine couche.

Ainsi, un chat ne doit pas étendre CatDatamapper car cela créerait une relation est-une relation et attacher le chat à la couche de persistance. Si vous souhaitez pouvoir gérer la persistance de votre chat de cette manière, consultez activeCord ou tout des autres modèles architecturaux de source de données.

Vous utilisez généralement un Datamapper lors de l'utilisation d'un modèle de domaine. Un simple Datamapper ne ferait que mapper une table de base de données à une classe en mémoire équivalente sur une base de champ à champ. Cependant, lorsque la nécessité d'un Datamapper se pose, vous n'avez généralement pas de telles relations simples. Les tables ne seront pas de 1: 1 à vos objets. Au lieu de cela, plusieurs tables pourraient se former dans un agrégat d'objet et vice-versa. Par conséquent, la mise en œuvre de juste les méthodes de crud peuvent facilement devenir un défi.

En dehors de cela, c'est l'un des motifs les plus compliqués (couvre 15 pages en Poée), souvent utilisé en combinaison avec le Modèle de référentiel entre autres. Regardez dans la colonne Questions associées sur le côté droit de cette page pour des questions similaires.

Quant à votre question sur plusieurs utilisateurs édition du même chat, c'est un problème commun appelé Concurrence . Une solution à ce qui serait Verrouillage de la ligne , tandis que quelqu'un l'édite. Mais comme tout, cela peut Diriger à d'autres problèmes .


8 commentaires

J'ai une question concernant la passerelle Data Maper VS Table Data Gateway (TDG). Tables de motif TDG Cartes 1: 1 Avec une table, mais souvent dans certaines méthodes de classe TDG, nous devons rejoindre la table principale avec d'autres tables (pour vous joindre à certaines tables parent pour sélectionner des informations supplémentaires). Une telle chose viole-t-elle le modèle de passerelle de la table? IMHO Dès que vous ajoutez d'autres tables DB (même des jointures) dans des instructions SQL dans les méthodes de classe TDG ou diviser votre modèle (modèle de domaine ou données de table) en deux - la classe devient une classe de carte de données. IMHO Data Maper n'est qu'une évolution normale de vos classes TDG.


En outre, si votre classe de source de données implémentée est capable de se connecter à diverses sources (DB ou certains WebService), alors vous avez implémenté une classe de carte de données implémentée.


Les États de Fowler à Poaa qu'un TDG peut contenir le code permettant d'accéder à de nombreuses tables / vues, donc je suppose que vous pouvez le rejoindre également. Mais bien sûr, cela signifie que les résultats retournés ne correspondront plus à 1: 1 aux tables et vous aurez besoin de la mise à jour spécialisée et insérez des requêtes pour ces lignes en plus des génériques. Je peux voir comment cela vous fait conclure que cela ressemble au mappeur de données, mais le but de la mappeuse des données est vraiment beaucoup plus complexe que cela. Ce n'est pas seulement rejoindre => Datamapper. Jetez un coup d'œil à css.dzone.com/books/ PRAST-PHP-Modèles / ...


Oui, je suis d'accord Datamapper est pour des tâches plus complexes. Qu'en est-il de différentes données de données? Si ma classe TDG implémentée est capable de se connecter à diverses sources (DB ou de service Web, en fonction du paramètre transcuté au constructeur), alors iMho My Class n'est plus une classe TDG, et c'est plus de classe de Data Caper? Je suppose que parfois, il serait peut-être difficile d'être théoriquement strict: est une catégorie de la carte de données mettant en œuvre une passerelle de table ou un modèle de mapper de données.


Je discuterais dans ce cas, c'est plus comme un Façade distante . Mais pourquoi pas juste acheter le livre? C'est un classique de toute façon.


Certainement :) merci. En outre, c'est toujours une bonne pratique de discuter avec quelqu'un qui a une connaissance dans cela.


Une autre question: à partir d'une utilisation pratique de mappeuse de données, je vois que l'un des principaux avantages de la mise en œuvre du modèle de mapper des données est d'avoir un "context_manager" ou "entité_manager" qui gère toutes les opérations de CRUD en schéma. Par exemple, j'ai beaucoup de classes de modèle de domaine qui pourraient ne pas être ni connexes 1: 1 avec des tables de base de données. Je peux instancier les classes de modèle de domaine, modifier et marquer ces objets entités pour économiser (lors de la manipulation). Ensuite, un appel à l'entité_manager.save () gère et enregistre tous les changements dans DB. C'est une solution très performante-wise car toute SQL est effectuée dans une transaction.


Ces hypothèses sont fabriquées à partir de DOCTRINE 2: doctrine-project.org/docs/orm/2.0/fr/Tutorials/.../a>



1
votes

PDO comporte une capacité d'orèse à créer des cas de chat. Disons que j'utilise que, ou laissez même dire que j'ai un MapDataSet () fonction qui prend un Array associatif. Cependant, dès que J'ai eu mon objet de chat d'un ensemble de données, je avoir des données redondantes. À la fois, Vingt utilisateurs pourraient prendre la même chose Données de CAT de la base de données et modifier L'objet de chat, c'est-à-dire renommer le chat, et sauvegarder (), tandis qu'un autre utilisateur encore des choses à propos de la définition d'un autre furcolor. Quand tous sauvent leur Edits, tout est gâché.

Afin de garder une trace de l'état des données typiquement et identitéMap et / ou une unité de travail servirait de garder une trace de toutes les opérations différentes sur des entités mappées ... et la fin du cycle de demande Al les opérations seraient alors effectué.


0 commentaires

2
votes

Mise en œuvre d'une mappeuse de données est très difficile dans PHP <5,3, car vous ne pouvez pas lire / écrire des champs protégés / privés. Vous avez quelques choix lors du chargement et de la sauvegarde des objets:

  1. Utilisez une sorte de solution de contournement, comme la sérialisation de l'objet, la modification de la représentation de la chaîne et la ramener avec insériité
  2. Faites tous les champs publics
  3. Gardez-les privées / protégées et écrivez des mutateurs / des accesseurs pour chacun d'eux

    La première méthode a la possibilité de rompre avec une nouvelle version et est un piratage très brut, le second est considéré comme une (très) mauvaise pratique.

    La troisième option est également considérée comme une mauvaise pratique, car vous ne devez pas fournir à des getters / setters pour tous vos champs, seuls ceux qui en ont besoin. Votre modèle est "endommagé" à partir d'une perspective pure DDD (conception axée sur le domaine), car il contient des méthodes qui ne sont nécessaires qu'en raison du mécanisme de persistance. Cela signifie également que vous devez désormais décrire un autre mappage pour les champs -> Méthodes de setter, à côté des champs -> Colonnes de table.

    php 5.3 introduit la possibilité d'accéder / de modifier tous les types de champs, à l'aide de la réflexion:

    http://hu2.php.net/manual/fr/flectionProperty .SetAccessable.php

    Avec cela, vous pouvez obtenir une véritable mappeuse de données, car la nécessité de fournir des mutateurs pour tous les champs a cessé.


0 commentaires