Best Practices für Post-Redirect-Get (PRG) mit MVC in PHP

9

Gibt es eine Best Practice für PRG-Muster mit MVC?
In diesem Tutorial:
Ссылка Die vorgeschlagene Lösung erfordert 4 Aktionen:
Create_Item (POST) = & gt; "setzt" das Formular zurück und leitet es an Display_Item weiter. Display_Item (GET) = & gt; zeigt das Formular (mit temporären Daten und Fehlern falls vorhanden)
Store_Item (POST) = & gt; versuchen Sie, Daten in der Datenbank zu speichern, wenn Fehler, Fehler speichern und an Display_Item umleiten, wenn der Erfolg in Display_Stored umgeleitet wird Display_Stored (GET) = & gt; zeigt das erstellte Objekt oder eine Erfolgsmeldung an, tec.

Nun, ich denke, dass die erste Aktion mit POST ein Problem ist, weil wir das Formular nicht mit einem Link starten können. Die Verwendung von GET in Create_Item scheint eine bessere Option zu sein.
Und wir können dasselbe auch mit 3 Aktionen tun (mit derselben Aktion für Create_Item und Display_Item, aber mit einem zusätzlichen Flag zum Zurücksetzen des Formulars, zum Beispiel:
Ссылка

Und wir können dasselbe auch mit nur zwei Aktionen tun, da wir ein if in- Create_Item verwenden können, um zu überprüfen, ob die Anfrage GET oder POST ist (also kombinieren wir Display_Item mit Store_Item).
< br> Und wir können dasselbe auch mit nur einer Aktion tun, weil wir ein zusätzliches Flag (in der URL-Abfrage oder in einer Sitzung) haben können, um die Ergebnisse anstelle des Formulars anzuzeigen:
GET Ссылка = & gt; zeigt ein neues Formular an und leitet zur nächsten URL weiter GET Ссылка = & gt; zeigt ein Formular mit temporären Daten und Fehlern, falls vorhanden POST Ссылка = & gt; Speichern Sie Fehler in Temp oder Daten in der DB (und setzen Sie eine Sitzung Flag für den Erfolg) und leitet an die obige URL oder nächste URL
GET Ссылка = & gt; Wenn $ _SESSION ['Erfolg'] Ergebnisse anzeigen

Persönlich mag ich die Idee von 4 Aktionen, aber ich habe keinen wirklichen Vorteil gegenüber den anderen Optionen. Aber ich fühle mich nicht sicher, mein Design ohne echte Kriterien zu wählen Kennt jemand die PROS und CONS jedes Entwurfs (falls vorhanden)?

Zum Beispiel sehe ich die 4 Aktionen sauberer, aber wenn wir ändern möchten, wie die Temp-Daten gespeichert werden, müssen wir es an 4 Stellen ändern Danke!

    
Enrique 08.05.2011, 22:15
quelle

1 Antwort

4

Das Muster ist zu GET ein leeres Formular, ändern Sie den Inhalt des Formulars, dann POST das zum Server, der dann eine Weiterleitung an eine andere Seite sendet, die ein GET ist, vielleicht zu einer Seite sagen %Code%. (Get- & gt;) Post- & gt; Redirect- & gt; Get

Die erste Aktion ist nicht wirklich Form submitted successfully. . Das ist das Endergebnis, wenn Sie ein Formular ausfüllen und abschicken. Der Leitfaden ist mehr darüber, was nach dem POST zu tun ist, als würde man keine Weiterleitung machen, dann bleibt der Benutzer auf einer Seite und sagt POST , wo er einfach F5 drücken und ein weiteres Form submitted successfully machen könnte. Bei dieser Weiterleitung befinden sie sich jedoch über eine sichere POST auf dieser Ergebnisseite, was nicht zu einer doppelten Post führt.

Was die Implementierung betrifft, sollten Sie auf der Serverseite jeweils eine eigene Aktion ausführen. Dies ist inline mit der MVC / RESTful-Implementierung.

  • GET / URL? action = Neu - & gt; Rufen Sie die new_form () -Methode auf, um ein neues Formular zu rendern
  • POST / URL? action = erstellen - & gt; Rufen Sie die create_form () -Methode zum Speichern und Weiterleiten an / url auf? Action = show & amp; id = 1234
  • GET / URL? action = show & amp; id = 1234 - & gt; Rufen Sie die show_form () -Methode auf, um das Ergebnis anzuzeigen
  • POST / URL? action = speichern & amp; id = 1234 - & gt; Rufen Sie die Methode save_form () auf, um
  • zu speichern und umzuleiten

Sie könnten stattdessen 3 Aktionen verwenden, wenn Sie den 2. Aktionsaufruf GET haben möchten. Die meisten REST / CRUD-Konventionen verwenden die 4, aber Sie haben die Wahl. Die Vorteile sind die gleichen wie die REST / MVC Route überhaupt.

Siehe auch diese Ressourcen:

  • RESTful Web Services
  • Dies behandelt typische Konventionen für RESTful-Controller. Es deckt Rails ab, gilt aber auch für PHP, wenn Sie die REST-Route nutzen wollen.
Bryan Drewery 08.05.2011, 22:31
quelle