3

Ich habe zwei Tabellen: Kampagnen, Campaign_statistics. Ich muss eine Kampagnenliste mit verschachtelten Statistiken ausgeben.Ist es eine gute Übung, Getter in einer Ansicht zu verwenden?

zu starten, Ich hatte gerade eine Methode in Modell, das eine Anordnung wie folgt erstellt:

array(
    'id', // integer 
    'campaign_name',// string 
    'stats'// nested array of arrays with stats by periods 
); 

In einer Ansicht I zwei foreach Schleifen hatte (ineinander geschachtelt):

<? foreach ($this->campaigns as $campaign): ?> 
    <div class="campaign"> 
     <?= $campaign['name'] ?> 
     <? foreach($campaign['stats'] as $monthStats): ?> 
      <div class="statistics"> 
       <?= $monthStats['views'] ?> 
      </div> 
     <? endforeach ?> 
    </div> 
<? endforeach ?> 

Die Implementierung eines Modells führt zu unordentlichem Code. Daher habe ich beschlossen, Campaign zu einem Objekt zu machen. In Hinblick mache ich Gebrauch von Getter:

<? foreach($this->campaigns as $campaign): ?> 
    <div class="campaign"> 
    <?= $campaign->getName() ?> 
    <? foreach($campaign->getMonthStats() as $monthStats): ?> 
     <div class="statistics"> 
      <?= $monthStats->getViews() ?> 
     </div> 
    <? endforeach ?> 
    </div> 
<? endforeach ?> 

Ich habe nie Framework verwendet Getter so gesehen. Was sind Vor- und Nachteile dieses Ansatzes?

Antwort

4

Die Schönheit mit Gettern im objektorientierten Design ist, dass sie die Komplexität der Berechnung des zurückgegebenen Ergebnisses verbergen. So können Sie die Art der Berechnung der Ansichten ändern und sie automatisch für alle Anwendungen aktualisieren.

Purists behaupten, dass Sie Methodenaufrufe in Ansichten usw. nicht haben sollten, aber Pragmatiker wie ich sagen, setzen Sie Methodenaufrufe in Ansichten, da Methoden Einheit getestet werden können. Wenn Sie jedoch feststellen, dass die Ausgaben zu komplex werden (Martin Fowler nennt diese Objekte zu eng miteinander), müssen Sie einen einzelnen Methodenaufruf umgestalten.

Fazit: Methoden gut, weil ihre Ausgänge

0

Klingt OK für mich :) Magento ermöglichen das gleiche zum Beispiel.

Wie auch immer, es ist mehr eine Frage der persönlichen Ansicht als alles andere ... Aber ich stimme eher mit Ihnen überein, es macht das Modell oder den Controller leichter lesbar (keine Notwendigkeit für $ view-> toto = $ model-> getToto()

1

Ich hatte schon früher dasselbe Argument mit meinen Kollegen, und ich stimme der Verwendung von Methoden in der Vorlage nicht zu.Dies macht Vorlagen nicht transparent, es gibt keine klare Kenntnis von was innerhalb der Vorlage verfügbar ist - Sie müssen Objekte kennen, die Sie behandeln Mit und Designer, noch Entwickler, die später beitreten, sollten sich darüber keine Gedanken machen, sie sollten sehen, was in Controller passiert und das ist es. Nicht zu erwähnen, dass Methodenaufrufe aus einer Vorlage Daten ändern können, die bereits innerhalb übergeben wurde .. Und obwohl ich weiß, dass es in einigen Fällen in Ordnung ist, die Vorlage zu ändern s im Zyklus oder so, tendiere ich zu der Annahme, dass die Vorlage statischer ist als der Rest des Codes - die Iteration über ein Array ändert kein anderes Array. Aber ich bin nicht so sicher mit Objekten.

Es fügt auch zusätzliche Abhängigkeit für das Refactoring hinzu.

Und es fügt auch Komplexität und Verführung für Entwickler hinzu, um zu beginnen, SQLs anzurufen oder schwere Logik innerhalb einer Schablone zu machen.

Ich könnte wahrscheinlich auch darauf hinweisen, dass einfache Template-Engines dazu tendieren, ein einfacher Textersetzer zu sein. Und Methoden sind für sie keine Option.

+0

prüft werden können wir über Getter sind gesprochen, nicht groß Methoden :) Ich stimmen Sie für etwas komplexer als Getter – haltabush

+1

rechts. Nun, ich habe nur Angst vor Doppelpunkten: D Ich nehme an, wenn Sie wissen, was Sie tun, ist es in Ordnung, mit Uran zu mischen. –

1

Normalerweise werden Sie keine expliziten Getter sehen, die Leute sehen, die auf die Eigenschaften zugreifen.
Dies funktioniert jedoch nur, wenn Ihre Eigenschaften öffentlich sind.
Wenn Sie Zend_Form in der Ansicht implementieren, können Sie auf die Elemente und andere Attribute zugreifen, indem Sie Getter und Setter verwenden.
Ich sehe kein großes Problem mit der Wahl, die Sie getroffen haben.
Ich habe jedoch möglicherweise die zweite foreach() mit der partialLoop() View-Helfer implementiert oder möglicherweise meine eigenen View-Helfer gebaut, vor allem, wenn dies etwas war, das ich an mehreren Orten verwenden wollte.

//example of what is commonly seen... 
<? foreach($this->campaigns as $campaign): ?> 
    <div class="campaign"> 
    <?= $campaign->name ?> 
    <? foreach($campaign->stats as $monthStats): ?> 
     <div class="statistics"> 
      <?= $monthStats->views() ?> 
     </div> 
    <? endforeach ?> 
    </div> 
<? endforeach ?> 

Nur meine Meinung, viel Spaß.

Verwandte Themen