2017-08-26 1 views
0

Ich bin ein Anfänger, aber kämpft hart, um diese interaktive Anwendung zu implementieren Ich arbeite an "der richtige Weg" oder zumindest ein guter Weg in Bezug auf Skalierbarkeit, Wartbarkeit, Modularität, Entwicklungsgeschwindigkeit und Werkzeugunabhängigkeit. Aus diesem Grund habe ich die REST Design Guides und ein Framework, das MVC implementiert, ausgewählt. MVC + REST + verschachtelte Ressourcen + einzelne Seite App

aber ich kann nicht meinen Kopf um, wo in der folgenden Situation zu setzen, was und jede Eingabe oder Lesematerial von einem erfahrenen Entwickler in diesen Techniken würde sehr geschätzt:

Ich entwickle einen einzige Web-App, die eine Ressource erstellt, die mehrere verschachtelte Ressourcen enthält. Bei den create-Methoden und ähnlichem muss ich die create-Methoden aus den verschachtelten Ressourcen aufrufen. Im Moment wird jede GET-Anfrage mit einem JSON beantwortet, welches dann vom Frontend analysiert, angezeigt und dynamisch zur Seite hinzugefügt wird. Die Frage ist: Wo soll das Erstellen und Speichern von Methoden aus verschachtelten Ressourcen sein, im Controller oder im Modell?

Zur Zeit ist meine Vorgehensweise: Da die Controller-Funktion Benutzereingaben verarbeitet, mit dem Modell interagiert und die Ansicht entsprechend zurückgibt, sind die geschachtelten Speichermethoden im Modell, da sie nicht unabhängig voneinander erstellt werden der Controller, da sie von Ajax-Aufrufen angefordert werden, aber dies ist nicht verschachtelt und so weiter. Ich bin besorgt, dass das zu durcheinander ist und nicht allgemein.

Bin ich ok? Bin ich durcheinander? Ich möchte meinen Mitarbeitern kein Durcheinander verordnen. Die Theorie wird schwierig, wenn sie angewendet wird.

Antwort

1

Ich werde es versuchen. Ich lerne selbst immer noch darüber, also wenn irgendwelche Informationen falsch sind, bitte korrigieren Sie mich.

Im Hinblick auf die Skalierbarkeit sollten Sie immer in der Lage sein, jedes Modell unabhängig voneinander zu erstellen, auch wenn dies an dieser Stelle nicht unbedingt notwendig erscheint. Das REST-Paradigma steht für genau das: Jedes Modell (auch bekannt als Ressource) hat seine eigenen (Unter-) Sätze von CRUD Endpunkten, die eine Client-Anwendung verwenden kann, um eine beliebige Zusammensetzung von Daten auszuführen (Kompositionen, in denen elementare Entitäten meistens sind Modelle, die Sie angeben).

Darüber hinaus sollte sich ein Modell nur mit seinen eigenen Daten befassen, und diese Daten werden normalerweise in einer einzigen Tabelle gefunden (im Fall von relationalen Datenspeichern). In vielen Fällen spezifizieren Modelle Einrichtungen, um verwandte Ressourcen zu lesen, so dass diese Daten bei Bedarf aufgenommen werden können. Das ist wie die Linie unten aussehen könnte, und die Antwort ist ideal voll kompatibel mit dem JSON API specification:

GET //api/my-resources/1?include=related-resource

Allerdings sollte ein Modell erstellen nie (POST), update (PUT) oder löschen (DELETE) diese Beziehungen überhaupt nicht ohne ausdrückliche Anweisungen dazu.

Wenn Sie ein Verfahren, wo ein Modell und seine verschachtelten Modelle (I verwandte Modelle gehen davon) in einem einzigen geschaffen werden geht, ein zusätzlicher Endpunkt kann für diese Aktion erstellt werden. Sie müssten einen sinnvollen Namen für diese Gruppe von Ressourcen erstellen und diesen im HTTP-/Support-Layer Ihrer Anwendung verwenden.Zum Beispiel für die Erstellung eines solchen Satzes, könnte die Anforderung sein:

POST //api/sensible-name { your: 'data' }

Halten Sie die { your: 'data' } Teil so nah an einem typischen JSON API Format wie möglich, vorzugsweise vollständig kompatibel. Dann, in Ihrem Back-End (ich nehme an, Laravel, in Ihrem Fall) möchten Sie eine factory implementation erstellen, die <SensibleName>Factory genannt werden kann, die sich darum kümmert herauszufinden, wie die geposteten Daten zu verschiedenen Modellen zugeordnet werden und wie ihre Beziehungen aussehen sollten angegeben werden. Unter der Haube nutzt diese Fabrik nur die Kreationsmöglichkeiten der Modellklassen, um Sie dorthin zu bringen, wo Sie hin wollen.

Wenn Sie stattdessen diesen Prozess in Ihrem Modell automatisieren würden, wäre es unmöglich, die Ressourcen unabhängig voneinander zu erstellen.

Wenn Sie stattdessen diesen Prozess in jedem Einzelressourcen-Controller automatisieren würden, der nicht dem REST-Paradigma entspricht.

Mit dem Factory-Muster verwenden Sie explizit diese Klasse, um die Aktion auf höherer Ebene auszuführen, und keine der obigen Bedenken gilt, nicht darüber, ob dieser Ansatz überhaupt mit REST in Einklang steht.

Der Schlüssel zum Mitnehmen ist, dass genau das gleiche Ergebnis noch durch Ausführen mehrere Anforderungen an Einzel Ressource Endpunkte erreichbar sein müssen, und Ihre zusätzlichen /api/sensible-name Endpunkt ersetzt nur für die Notwendigkeit, diese mehrere Endpunkte zu nennen, zum Zwecke der Bequemlichkeit, wenn Sie mehrere Datensätze in einem einzigen Schritt erstellen möchten.

Beachten Sie, dass meine Anweisung nur wenig damit zu tun hat, welche Endpunkte zum Abrufen verschachtelter Ressourcen erstellt werden sollen. This SO question hat eine ziemlich gute Konversation darüber, was akzeptabel ist und wie sich Ihre spezifischen Bedürfnisse darauf beziehen können.

Am Ende geht es darum, was für Sie und Ihre Anwendung funktioniert, und REST und dergleichen sind nur Philosophien, die Ihnen einen Ansatz für ähnliche Bedürfnisse in der allgemeinen Webentwicklung vorschlagen.

+0

Danke. Ich mag diesen Factory-Ansatz viel mehr, da Ressourcen unabhängig voneinander erstellt werden können und der Code aufgrund einer Ansichtsanforderung nicht an einen bestimmten Ort gebunden ist. Nur um es klar zu machen: Jedes Modell sollte seine eigenen Kreationsanlagen haben, die für die Fabrik zugänglich sind und nur mit ihrem Tisch in Beziehung stehen. Ihre Controller stellen Zugangspunkte für diese Methoden bereit. Die Fabrik hat Zugriff auf mehrere Modellmethoden und arbeitet als "kombinierte Ressource" für die Single-Go-Operationen. Ist das in Ordnung? Vielen Dank für Ihre Zeit Jeffrey. –

+0

Ja das ist richtig. Unabhängig davon, ob Sie tatsächliche Endpunkte bereitstellen, um Vorgänge an Ressourcen durchzuführen, unterstützt eine skalierbare Anwendung die Implementierung solcher Endpunkte jederzeit von der DB zur HTTP-Schicht. Erstellen einer Route und Controller ist dann Plug-and-Play. Viel Glück, gern geschehen. –