Das Problem bei der Formularverarbeitung ist, dass es per Definition gegen MVC verstößt. Dies ist ein Problem, das als "crosscutting" bekannt ist und in der Vergangenheit von der Wissenschaft untersucht wurde. Das Papier Domain Driven Web Development With WebJinn zum Beispiel ist eine interessante Lektüre über das Thema.
Als Beispiel denkt über das Verhältnis von Formen zu den verschiedenen Schichten von MVC:
Modell:
- Forms replizieren die Informationsstruktur Ihres Domänenmodell (DM). Wenn Sie diese Struktur ändern (z. B. durch Hinzufügen von Feldern zu einer Datenstruktur oder durch Hinzufügen von Parametern zu einer Prozedur), müssen Sie auch die Formulare für die Eingabe dieser Informationen anpassen.
- Sie benötigen Typ Informationen von Ihrem DM, um Eingang zu den erforderlichen Typen zu konvertieren.
- Sie müssen die in Ihrem DM angegebenen Einschränkungen kennen, um die Eingabe zu validieren.
- Sie lesen und schreiben idealerweise Daten direkt von/zu Ihrem DM (z. B. durch Lesen/Schreiben von Feldern einer Datenstruktur oder durch Aufrufen einer Prozedur im DM mit den übergebenen Werten als Parameter).
Controller:
- Forms Empfangsdaten vorgelegt und an die DM schicken.
- Sie ändern den Programmablauf abhängig davon, ob sie erfolgreich validiert werden oder nicht.
Ausblick:?
- Forms als eine komplexe Struktur von HTML-Tags und Attribute machen, die (Sollte ein Feld erforderlich werden, um Fehler angezeigt werden auf alle oben hängt Sollte Wie die bestellen Felder? Welche Möglichkeiten in einem Drop-Down bieten? usw.)
Folglich ist es unmöglich eine Form Abstraktion Mechanismus zu schreiben, die nicht alle diese Schichten nicht berührt. Die Lösung besteht im Gegenteil darin, die Formularbibliothek selbst gemäß MVC in verschiedene Schichten und Unterkomponenten zu strukturieren, die die SRP erfüllen. Wenn Sie in die Symfony2 Form-Komponente schauen, ist das ziemlich gut. ;)
Also warum ist es so ein "massives gruseliges Biest"? Das erste Problem ist das der Abstraktion. Denken Sie zum Beispiel an ein einfaches Drop-down-Menü. Wenn wir den Code für das Drop-down wiederverwenden wollen, müssen wir ihn irgendwie abstrahieren. Überprüfen Sie die obige Liste, auch diese einfache Eingabe berührt alle drei Ebenen einer MVC-Anwendung. Wie kann man etwas abstrahieren, das in drei Teile gegliedert werden soll?
Das zweite Problem ist Feature-Vielfalt. Formularbibliotheken lösen nie alle Probleme, denen Entwickler in ihrem täglichen Leben gegenüberstehen. Daher müssen alle diese Ebenen und Abstraktionsmechanismen erweiterbar sein, damit Sie sich so verhalten können, wie Sie es möchten.
Während die Form-Komponente erweiterbar ist, löst sie bereits Hunderte kleiner Probleme, an die Sie nicht einmal mehr denken müssen. Wie man Datumsangaben eingibt, wie man eine oder mehrere Auswahllisten mit verschiedenen UIs (Drop-Downs, Checkboxen, Optionsfelder, etc.) auswählt, wie man Formulare wieder schützt Sicherheitslücken und vieles mehr sind Themen, auf die ich Essays schreiben könnte Über.
Sie sehen, dass Formularbibliotheken ziemlich komplex sind. Die beste Wette, die wir beim Schreiben solcher "massiven gruseligen Bestien" haben, besteht darin, ihre API so einfach wie möglich für Anfänger zu machen, so flexibel wie möglich für fortgeschrittene Benutzer und umfangreiche Dokumentation über die Nutzung ihrer vollen Power zu schreiben. Der letzte Punkt fehlt definitiv noch (please help!), aber wir arbeiten ständig an allen oben genannten Punkten.
Die Reduzierung eines Komplexes auf ein einfaches Problem ist dagegen leider nicht möglich.
Was ist mit anderen Formularbibliotheken, die so viel einfacher sind? Meiner bescheidenen Meinung nach versuchen diese nicht einmal, einen Großteil der Probleme zu lösen, die die Symfony2 Form-Komponente für Sie bereits löst. :)
-Update 24. Januar 2014: Für alle, die mehr wissen (viel mehr) will, ist hier a paper that I published on the subject.
Das sind 3rd-Party-Tools. Während es in Sf2 Designfehler gibt, sind die SRP-Verletzungen im eigentlichen Kern des Frameworks minimal und werden nur angewendet, wenn es sich um die pragmatische Lösung handelt. Was Sie sehen, ist nicht der Kern. –
Ich meinte, dass es scheint, irgendwo in der Kernidee von Symfony existiert etwas, das die Leute dazu treibt, diese verrückten Bündel zu schreiben. Aber ist die Form-Komponente nicht eine Kernkomponente des Frameworks? – moljac024
Es gibt solche Komponenten in Zend Framework, aber es ist ziemlich schrecklich. Ich bin zu dem Schluss gekommen, dass die Schaffung jeglicher Art von "Fit-All-Form" -Bauern ein vergebliches Unterfangen ist. –