Domanda

Ad esempio:

Ho un utente che ha 10 Widget. Insieme a questo ho un manager che gestisce 5 di questi widget.

Voglio recuperare Widget dell'Utente gestito da un determinato Manager. Così ho creato una funzione nel mio WidgetMapper chiamato fetchUsersManagedWidgets ($ userId, $ ManagerID), che interroga il db per quei 5 widget e mappe una serie di Widget oggetti.

Lo so oggetti di dominio non dovrebbero essere consapevoli dei loro mapper, ma posso creare una funzione nel modello di utente che chiama una funzione del WidgetMapper?

es.

class Application_Model_User {

    public function getWidgetsManagedBy($manager) {
        $widgetMapper = new Application_Model_WidgetMapper;
        return $widgetMapper->fetchUsersManagedWidgets($this->getId(), $manager->getId());
    }

}

O si tratta di una strada a senso, e gli oggetti di dominio non dovrebbe mai chiamare le funzioni mapper?

È stato utile?

Soluzione

Pattern in generale sono un'idea di come si potrebbe risolvere un problema comune. La loro non è né una "hanno a che fare in questo modo" o "tutto il resto è cattivo". In realtà c'è anche un nome per un decission non seguendo modelli intenzionali.
Da quello che ho visto la gente tende a pensare "un db-tavolo è un dominio in modo che ogni db-tavolo ha bisogno di un modello e un mapper". Nel tuo caso mi si supponga di avere tre tabelle: gli utenti, i widget e la tabella che tiene il n:. M relazione tra i due (lo chiamerò userwidgets)
I userwidgets è veramente parte del modello utente e non dispone di un proprio modello / mapper ed è non parte del modello del widget. Per risolvere tali ID widget nella usermodel hanno bisogno il widget di mapper, naturalmente, che i risultati del problema che descrivono.
Ci sono probabilmente c'è sacco di modi per risolvere questo, ho semplicemente presumo un default-mapper che è overwritable:

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;
    }
}

Nel caso in cui non si desidera utilizzare il widget-mapper di default si dovrebbe semplicemente impostarlo prima di accedere widget degli utenti (dovrebbero essere caricati su richiesta).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top