2016-04-13 8 views
1

Wenn ich eine Entität habe und ich möchte speichern, validieren oder löschen. Warum muss ich die Table-Methode aufrufen? Zum Beispiel:CakePHP 3: Aufruf von Tabellenfunktionen von Entity ist eine schlechte oder gute Idee?

$articlesTable = TableRegistry::get('Articles'); 
$article = $articlesTable->get(12); 

$article->title = 'CakePHP is THE best PHP framework!'; 
$articlesTable->save($article); 

Warum ist nicht so:

$article->save(); 

oder $article->delete();

Es ist sehr einfach zu implementieren:

Auf meinem Artikel Entity ich tun kann, es mag:

namespace App\Model\Entity; 
use Cake\ORM\Entity; 

class Article extends Entity 
{ 

    public function save() 
    { 
     $table = TableRegistry::get($this->source()); 
     $table->save($this); 
    } 

} 

Es funktioniert, aber ich würde gerne wissen, ob es eine schlechte Übung oder eine gute Idee ist.

Vielen Dank im Voraus :)

Antwort

4

TL; DR: Technisch Sie es für den hohen Preis der engen Kopplung tun können (die schlechte Praxis betrachtet wird).

Erläuterung: Ich würde diese Best Practice nicht berücksichtigen, da die Entität ein dummes Datenobjekt sein soll. Es sollte keine Geschäftslogik enthalten. In der Regel ist es nicht nur ein einfacher Speicheraufruf, sondern es gibt auch eine Nachfolge-Logik zur Implementierung: Behandeln Sie Erfolg und Misserfolg des Speicherns und handeln Sie entsprechend, indem Sie die Benutzeroberfläche aktualisieren oder eine Antwort senden. Außerdem koppeln Sie die Entität effektiv mit einer bestimmten Tabelle. Sie verwandeln ein dummes Datenobjekt in ein Objekt, das Geschäftslogik implementiert.

Technisch kann man es auf diese Weise tun, und ich denke, es gibt Frameworks oder ORMs, dass es auf diese Weise tun, aber ich bin kein Fan von Kupplungs Dinge. Ich bevorzuge es, Code so verlustfrei wie möglich schreiben zu schreiben. See also SoC.

Auch glaube ich nicht, dass Sie mit Ihrem Ansatz keine Codezeilen speichern werden, können Sie es nur an einen anderen Ort bewegen. Ich sehe keinen Vorteil, der die Einführung der Verknüpfung der Entität mit der Geschäftslogik rechtfertigen würde.

Wenn Sie Ihren Weg gehen würde ich diese Methode als ein Merkmal implementieren oder eine Basisentität Klasse verwenden, um von erben den Code zu wiederholen.

+0

Ich möchte mehr über diesen Ansatz lernen. Ich hatte es vorher nicht für Table vs Entity Klassen in CakePHP in Betracht gezogen und ich habe diese Absicht nicht aus den offiziellen Dokumenten verstanden. Gibt es zu diesem Thema irgendwo eine tiefere Diskussion, die Sie zum Lesen empfehlen würden? Ich habe über die Unterscheidung in Bezug auf Sätze gegen Individuen nachgedacht. Also gehen Methoden, die sich mit Gruppen von Entitäten befassen, in die Klasse Table und Methoden, die sich nur mit einzelnen Entitäten befassen, in der Entity-Klasse. Aber ich sehe, dass dies nicht wirklich viel anderes als irgendeine triviale Code-Organisation erreicht. – Ethan

+0

Aufrufe an Entity-Setter ** delegiere nicht an das Tabellenobjekt, noch an Getter. Entitäten sind einfache dumme Datenobjekte. Sie stellen eine einzelne Zeile in RDBMS oder ein Dokument in einem dokumentbasierten Speicher dar. Der Punkt ist nicht nur Code-Organisation, sondern * Trennung *. Das Ziel ist Modularität und dadurch einfache Wartung und Wiederverwendbarkeit. Du kannst aus 10 Steinen etwas Neues bauen, wenn du sie aneinander klebst oder festnagelst, kannst du es nicht, sie sind gekoppelt und stecken fest und sind später schwer auseinander zu brechen. Gleiches gilt für Software. Schlug lesen: https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882 – burzum

+1

ich die Trennung von Bedenken Prinzip in der Zusammenfassung zu verstehen, und ich kann sehen, wie es in vielen anderen Situationen gilt, aber ich hatte Schwierigkeiten, es mit Entitäten gegen Tabellen anzuwenden.Ich denke, ich verstehe es jetzt. Entitäten sind ein Ersatz für die geraden "dumber" -Arrays, die v2 benutzt hat, daher war die Rolle, von der sie kommen, sehr begrenzt. Eine Entität muss nicht von einem Tisch kommen, und nichts erfordert, dass sie jemals für einen beibehalten wird. Es darf niemals eine 'id' haben, niemals Standardwerte, die während 'beforeSave()' usw. von der Table-Klasse angewendet werden. – Ethan