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?

Était-ce utile?

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top