Peut-objets de domaine appeler d'autres cartographes de données? (Zend Framework)
-
26-09-2019 - |
Question
Par exemple:
J'ai un utilisateur qui a 10 Widgets. Parallèlement à cela, j'ai un directeur qui gère 5 de ces widgets.
Je veux récupérer Widgets géré par un gestionnaire de l'utilisateur spécifié. J'ai donc créé une fonction dans mon WidgetMapper appelé fetchUsersManagedWidgets ($ userId, $ ManagerID) qui interroge le db pour les 5 widgets et cartes un tableau d'objets widget.
Je sais que des objets de domaine ne sont pas censés être au courant de leurs cartographes, mais puis-je créer une fonction dans le modèle de l'utilisateur qui appelle une fonction du WidgetMapper?
par exemple.
class Application_Model_User {
public function getWidgetsManagedBy($manager) {
$widgetMapper = new Application_Model_WidgetMapper;
return $widgetMapper->fetchUsersManagedWidgets($this->getId(), $manager->getId());
}
}
Ou est-ce une rue à sens unique, et les objets de domaine ne doit jamais appeler des fonctions Mapper?
La solution
Motif en général sont une idée de la façon dont vous pouvez résoudre un problème commun. Leur est ni « avoir à le faire de cette façon » ou « tout le reste est mauvais ». En fait, il y a même nom pour un decission non intentionnels suivants modèles.
D'après ce que j'ai vu des gens ont tendance à penser « une table db-est un domaine pour chaque besoin db table un modèle et un mappeur ». Je suppose que vous avez dans votre cas trois tables: les utilisateurs, les widgets et la table tenant le n. m relation entre ces deux (je vais l'appeler userwidgets)
Les userwidgets est vraiment partie du modèle d'utilisateur et ne dispose pas d'un propre modèle / Mapper et est pas du modèle widget. Pour résoudre ces widgets IDs userModel ont besoin cartographe widget de cours dont les résultats dans le problème que vous décrivez.
Il y a probablement est beaucoup de façons de résoudre ce problème, je suppose simplement un défaut mappeur qui est réinscriptible:
Class UserModel
{
$_widgetMapper = null;
public function getWidgetMapper()
{
if(null === $this->_widgetMapper)
{
$this->setWidgetMapper(new DefaultWidgetMapper());
}
return $this->_widgetMapper();
}
public function setWidgetMapper($mapper)
{
// todo: make sure it's a mapper of the correct type
$this->_widgetMapper = $mapper;
}
}
Si vous ne voulez pas utiliser le widget-cartographe par défaut, vous devez simplement le définir avant d'accéder à des widgets de l'utilisateur (ils devraient être chargés à la demande).