2010-04-20 4 views
3

Bit d'un problème abstrait ici. J'expérimente le modèle de modèle de domaine, et en interdisant mes autres conflits avec les dépendances - j'ai besoin de conseils sur la génération d'identité pour une utilisation dans une carte d'identité.PHP OOP: Fournir des entités de domaine avec "Identity"

Dans la plupart des exemples pour le modèle Data Mapper Je l'ai vu (y compris celle qui est décrite dans ce livre: http://apress.com/book/view/9781590599099) - l'utilisateur semble définir manuellement l'identité d'un objet de domaine donné à l'aide d'un setter:

$UserMapper = new UserMapper; 

//returns a fully formed user object from record sets 
$User = $UserMapper->find(1); 

//returns an empty object with appropriate properties for completion 
$UserBlank = $UserMapper->get(); 
$UserBlank->setId(); 
$UserBlank->setOtherProperties(); 

Maintenant, je ne sais pas si je lis les exemples faux - mais dans le premier objet $ User, la propriété $ id est extraite du magasin de données (je suppose que $ id représente un identifiant de ligne). Dans ce dernier cas, cependant, comment pouvez-vous définir le $ id pour un objet s'il n'en a pas encore acquis dans le magasin de données? Le problème est de générer une "identité" valide pour l'objet afin qu'il puisse être maintenu via une carte d'identité - ainsi la génération d'un entier arbitraire ne le résout pas. Mon idée actuelle est de nommer différents champs pour l'identité (c'est-à-dire le courrier électronique) et d'exiger leur présence pour générer des objets de domaine vides. Alternativement, exiger que tous les objets soient entièrement formés, et utiliser toutes les propriétés comme leur identité ... peu efficace.

(Ou bien, vider le concept modèle de domaine et revenir à des scripts Dbal/DAO/transaction ... qui est de plus en plus qu'apparente élégant par rapport aux implémentations ORM je l'ai vu ...)

Répondre

0

Vous utiliseriez la fonction setId si vous contrôlez les ID, si vous voulez remplacer l'ID du magasin de données, ou si vous souhaitez mettre à jour/supprimer les données sans avoir à les récupérer en premier (c'est-à-dire avoir déjà l'ID d'un POST). Une autre alternative serait d'appeler setId() pour réserver un ID en "interrogeant" (insérer un enregistrement) le magasin de données pour l'ID disponible suivant.

L'ID n'est pas vraiment pertinent tant que vous n'avez pas réellement besoin de l'utiliser pour référencer quelque chose. Appeler setId sans paramètre ne ferait rien sauf marquer l'objet comme de nouvelles données. Une fois que vous essayez réellement d'obtenir l'ID, c'est quand l'un serait généré. Trier la génération d'ID paresseux.

+0

merci pour la réponse, cela m'a aidé à trouver une méthode pour faire face à cela. Je peux définir un ID arbitraire sur les entités vides qui sont rejetées/remplacées par un identifiant de ligne lors de la sauvegarde. La question restante est de savoir comment éviter les propriétés vides en double avant de sauvegarder - mais je suppose que cela pourrait être résolu par un champ d'identité s'il en existe un (c.-à-d. merci beaucoup – sunwukung

+0

Vous pouvez utiliser une variable statique (UserMapper :: $ ids) pour suivre des valeurs uniques à travers les objets. Faites-en un tableau pour pouvoir faire une "liste" que vous pouvez ajouter/supprimer. –