Frage

Ich bin relativ neu Orientiertes Programmieren Objekt. Ich verstehe, so ziemlich die Konzepte, aber praktisch gesehen, ich bin eine wirklich harte Zeit der Suche nach Informationen darüber, wie die optimalen Nutzung Modellen in meinen Zend Framework-Anwendungen mit.

Insbesondere habe ich ein Modell (das reicht nicht alles), die keine Datenbanktabelle nicht verwendet. Es nutzt Getter und Setter seiner geschützten Mitglieder zugreifen. Ich finde ich kämpfen mit, wie in der Ansicht dieses Modell am besten anzuzeigen. Ich will nicht, Logik meiner Ansicht nach Vorlagen, aber ich finde mich in der folgenden Situation:

In meinem Controller:

$object = new Object();
$object->setName('Foo Bar');
$this->view->object = $object;

Nach meiner Ansicht Vorlage:

<h2><?= $this->object->getName() ?></h2>

Ich weiß nicht wirklich wie Funktionen meiner Meinung nach Vorlagen aufrufen, aber ich weiß nicht, einen besseren Weg, dies zu tun. Ich will nicht meine Model Mitglieder der Öffentlichkeit sein, aber ich mag im Grunde die gleichen Ergebnisse erzielen:

<h2><?= $this->object->name ?></h2>

Ich will nicht mein Controller die ganze Arbeit zu haben, alles zu tun um das Modell zu wissen:

$object = new Object();
$object->setName('Foo Bar');
$this->view->object = $object;
$this->view->object->name = $object->getName();

Was ist die Best Practice-Modelle in das Zend Framework verwenden? Kann jemand eine Anleitung empfehlen, die mir dieses Model / View-Dilemma in Zend Framework verstehen würde helfen?

War es hilfreich?

Lösung

Eine Möglichkeit ist es, die Magie __set und __get Methoden in PHP zu verwenden. Ich benutze sie wie so in meiner abstrakten Modellklasse:

abstract class Model_Abstract
{
    protected $_data;

    // Private Data Members assigned to protected $_data
    public function __construct($data = null)
    {
        // Makes it so that I can pass in an associative array as well as 
        // an StdObject.
        if(!is_object($data)) {
            $data = (object) $data;
        }

        $this->_data = $data;

    }

    public function __get($key)
    {
        if (method_exists($this, '_get' . ucfirst($key))) {
            $method = '_get' . ucfirst($key);
            return $this->$method();            
        }
        else {
            return $this->_data->$key;
        }   
    }

    public function __set($key, $val)
    {
        if ( method_exists( $this, '_set' . ucfirst($key) ) ) {
            $method = '_set' . ucfirst($key);
            return $this->$method($val);            
        }
        else {
            $this->_data->$key = $val;
            return $this->_data->$key;
        }
    }
}


class Model_User extends Model_Abstract
{
    //Example overriding method for the property firstName in the $_data collection.
    protected function _getFirstName()
    {
        // Do some special processing and then output the first name.
    }
}

Das macht es so, dass Sie Getter und Setter für Eigenschaften wie nötig angeben kann es aber macht, so dass Sie Textvorschlag definieren müssen Funktionen nicht für jede Eigenschaft, nur die, wo Sie eine Art der Verarbeitung auf, es zu tun möchten bevor der Wert zurückkehrt. Zum Beispiel verwende ich die Funktionalität in einer Reihe von Orten ISO-konforme Daten ändern in ein kompaktere und lesbares Format für Anwender (wie in MySQL gespeichert).

Soweit, was in Ihrem Controller zu setzen, würde ich unter dieser Beitrag für einiges spezifisches Feedback auf welcher Behandlung in Ihrem Controller zu platzieren.

Einige glauben, dass sie lieber einen Helfer haben, die automatisch Modelle in die Ansicht geladen und umsäumt den Controller zusammen. Persönlich würde ich sagen, dass im Rahmen von Zend Framework und PHP es viel Sinn macht, Modelle in der Ansicht von der Steuerung zu übergeben, da der Zustand der Modelle in der Ansicht häufig davon abhängig, was von der Anfrage kam (was auf jeden Fall behandelt werden sollte in der Steuerung).

Update: Wie pro Kritik in den Kommentaren, eine Sache, die ich möchte darauf hinweisen, dass Ihre Datenbank-Zugriffsschicht und Domäne (oder Modell) Schicht sind wirklich zwei verschiedene Dinge, wenn auch mit dem Active Record sie werden miteinander vermischt. Ich fragte diese Frage eine Weile zurück und erhielt einige nützliche Feedback zu diesem Thema. Was auch immer Sie sich entscheiden, mit dem Modell zu tun, werden Sie wollen eine einheitliche API zur Verfügung zu stellen für alle Domain-Objekte unabhängig davon, wo die Daten für das Modell stammt aus.

Ich nehme an, dass ein Vorteil von Saem Antwort angeboten ist, dass es die Möglichkeit, Eigenschaften direkt Karte bietet / Funktion Rückgabewert von einem oder mehreren Domänenobjekten auf das Ansichtsobjekt. Theoretisch sieht die Nutzung innerhalb der Ansicht dann wie folgt aus:

// Mapped from Model_User::_data->last_name and Model_User::_data->first_name
$this->name 

Andere Tipps

Wenn nur andere Entwickler werden mit den Vorlagen zu arbeiten, würde ich empfehlen, in den Modellen nur vorbei. Hier ist ein Link zu einer Jeff Atwood Post auf MVC Verstehen Modell-View-Controller

Dies ist nicht besonders darauf ausgerichtet, Zend Framework, aber das Problem ist eher allgemein, in meinem Kopf.

Es scheint, dass Sie auf dem richtigen Weg sind, statt schwer, das Modell auf die Ansicht der Verdrahtung in der Steuerung. Sie würden eher, dass die abstrakte, vor allem dann wichtig, wenn Sie eine Tonne Modelle kartieren oder Abbildung des gleichen Modells immer und immer wieder.

Etwas einfacher wäre es, eine Reihe von Abbildungsfunktionen zu schreiben, was in Ordnung wäre, wenn alles, was Sie vermeiden wurden, ist die Abbildung die gleiche Sache immer und immer wieder.

Wenn Sie eine allgemeinere Lösung gesucht, die auch vermeiden angesprochen, dass das Kesselblech Code zu schreiben, und hält die Dinge DRY, schlage ich vor, eine Mapper-Klasse erstellen.

Sie könnten eine ViewModelMapper schaffen, die ein Modell nehmen würde, oder ein paar Modelle und sie der Ansicht abzubilden.

class ViewModelMapper
{
    public function __construct($view)
    {
        //set the properties
    }

    public function addModel($model, $overrideViewProperty = null)
    {
        //add the model to the list of models to map, use the view's property 
        // name to figure out what to map it to? Allow for an override just in case.
    }

    public function getMappedView()
    {
        //take the view, map all the models
    }
}

Sie könnten dann beispielsweise das auf dem Controller, und Setup die Zuordnungen, so dass der Controller die Zuordnung noch kontrolliert, aber die ganze Kesselblech und Kodierungslogik ist zentralisiert, für alle Controller-Karten, mit Ausnahme der seltenen Ausnahmen.

Für einen guten Read auf Modellarchitektur, lesen Sie diesen Beitrag . Es ist nicht speziell über die Aussicht zu sprechen, aber es ist auf jeden Fall lesenswert.

endete ich eine getViewClass() Funktion meiner Modelle addieren. Die Steuerung ruft diese Funktion auf die geschützten Variablen, um es sonst keinen Zugang haben würde, und die Aussicht hat nicht über Aufruf keine Getter Sorgen zu machen.

//controller
$object = new Object();
$object->setName('Foo Bar');
$this->view->object = $object->getViewClass();

//view template
<h2><?= $this->object->name ?></h2>

Ich weiß nicht, ob es ein besserer Weg, um den Job im Zend Framework zu erledigen, aber das ist eine Lösung.

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