Frage

Zum Beispiel:

Ich habe einen Benutzer, die 10 Widgets hat. Zusammen mit, dass ich einen Manager-haben, die 5 dieser Widgets verwaltet.

Ich möchte des Nutzers Widgets um einen bestimmten Manager verwaltet abzurufen. Also habe ich eine Funktion in meinem WidgetMapper fetchUsersManagedWidgets genannt ($ userId, $ MANAGERID), die den db für die 5-Widgets abfragt und ordnet eine Reihe von Widget-Objekte.

ich weiß, Domain-Objekte sind nicht bewusst sein, ihren Mapper sollen, aber kann ich eine Funktion im User-Modell erstellen, die eine Funktion des WidgetMapper nennt?

z.

class Application_Model_User {

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

}

Oder ist dies eine Einbahnstraße, und Domain-Objekte sollten niemals Mapper-Funktionen aufrufen?

War es hilfreich?

Lösung

Muster im Allgemeinen sind eine Vorstellung davon, wie man ein gemeinsames Problem lösen könnte. Ihr ist weder eine „haben es auf diese Weise zu tun“ oder „alles andere ist schlecht“. In der Tat gibt es sogar einen Namen für eine decission keine Muster folgende vorsätzliche.
Von dem, was ich habe Menschen gesehen, neigen dazu, „eine db-Tabelle ist eine Domäne, so dass jede db-Tabelle ein Modell und einen Mapper muss“ zu denken. In Ihrem Fall nehme ich an Sie haben drei Tabellen: Benutzer, Widgets und die Tabelle Halten der n. M Beziehung zwischen den beiden (i nenne es userwidgets)
Die userwidgets ist wirklich Teil des Benutzermodells und hat kein eigenes Modell / Mapper und ist nicht Teil des Widgets Modell. So beheben Sie diesen Widget-IDs in dem usermodel braucht das Widget Mapper natürlich die Ergebnisse in dem Problem, das Sie beschreiben.
Es gibt Möglichkeiten, wahrscheinlich viel, dies zu lösen, gehe ich davon einfach einen default-Mapper, die 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;
    }
}

Falls Sie nicht möchten, dass den Standard-Widget-Mapper verwenden Sie einfach einstellen sollten, bevor die Benutzer-Widgets zugreifen (sie bei Bedarf geladen werden sollen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top