2013-04-02 9 views
9

Im więcej używam Symfony2 i borykam się z jej formami, tym bardziej dochodzę do wniosku, że są one ogromną przerażającą bestią, która nawet nie powinna istnieć.Składnik Symfony2 Form - naruszenie MVC i SRP?

Natknąłem się na ten artykuł here i uważam, że zgadzam się z autorem. Nawet jeśli artykuł jest dla Symfony 1.x, wydaje mi się, że nadal ma składnik Form w Symfony2. Wygląda na to, że komponent formularza próbuje rozwiązać problemy, które należą do szablonu, kontrolera i modelu, wszystko w jednym miejscu. Czy to nie stanowi poważnego naruszenia MVC i/lub SRP (zasada jednej odpowiedzialności)?

To może być inna kwestia, ale czuję, że to jest trochę podobne - Mam również zauważyć, że wiele z dostępnych pakietach dla symfony spróbować rozwiązać zobacz kwestie poza widoku, na przykład:

KnpMenuBundle - generujesz menu po stronie serwera z oo-interfejsem (dlaczego nie w widoku warstwy, do której należą?)

IvoryCKEditorBundle - konwersja textarea do ckeditora odbywa się w jednej linii jquery w pliku widoku, więc dlaczego ten pakiet istnieje? Nie chcę nawet policzyć tamtejszej liczby linii.

Wygląda na to, że w Symfony są te naruszenia, czy ja po prostu ich nie dostaję?

+2

To są narzędzia innych firm. Chociaż są błędy konstrukcyjne w Sf2, naruszenie SRP w rdzeniu struktury jest minimalne i stosowane tylko wtedy, gdy jest to pragmatyczne rozwiązanie. To, na co patrzysz, nie jest rdzeniem. –

+0

Miałem na myśli, że wydaje się, że gdzieś w rdzeniu idei Symfony istnieje coś, co skłania ludzi do pisania tych zwariowanych pakietów. Ale czy komponent Form nie jest kluczowym komponentem struktury? – moljac024

+0

Są takie komponenty w Zend Framework, ale jest to dość okropne. Doszedłem do wniosku, że tworzenie wszelkiego rodzaju pasaży - wszystkich budujących formy jest dość daremnym przedsięwzięciem. –

Odpowiedz

20

Problem z przetwarzaniem formularzy polega na tym, że z definicji narusza to MVC. Jest to problem znany jako "crosscutting" i był badany przez naukę w przeszłości. Na przykład artykuł Domain Driven Web Development With WebJinn jest interesującą lekturą na ten temat.

Jako przykład, myśleć o relacji formy do różnych warstw MVC:

Model:

  • Formy replikować strukturę informacyjną swojego modelu domeny (DM). Jeśli zmienisz tę strukturę (np. Dodając pola do struktury danych lub dodając parametry do procedury), musisz także dostosować formularze do wprowadzania tych informacji.
  • Potrzebują one informacji o typie z DM, aby przekonwertować dane wejściowe na typy tam wymagane.
  • Muszą znać ograniczenia określone w DM, aby zweryfikować dane wejściowe.
  • Idealnie odczytują i zapisują dane bezpośrednio z/do DM (np. Odczytując/zapisując pola struktury danych lub wywołując procedurę w DM z przesłanymi wartościami jako parametrami).

Kontroler:

  • Formy otrzymują przedstawiły dane i wysłać go do DM.
  • Zmieniają one przebieg programu w zależności od tego, czy pomyślnie sprawdzają poprawność, czy też nie.

Widok:?

  • Formy renderowanie jako złożoną strukturę znaczników HTML i atrybutów, które zależy od wszystkich wyżej wymienionych (Jeżeli pole jest wymagane powinny być wyświetlane błędy Jak zamówić Pola? Co wybory do zaoferowania w rozwijanej? itd.)

w związku z tym niemożliwe jest napisać mechanizm forma abstrakcji, że nie dotyka wszystkich tych warstw. Przeciwnie, rozwiązanie polega na ustrukturyzowaniu samej biblioteki formularzy zgodnie z MVC, na różne warstwy i podkomponenty, które spełniają SRP. Jeśli zajrzysz do komponentu Symfony2 Form, robi to całkiem nieźle. ;)

Dlaczego więc jest to taka "masywna straszna bestia"? Pierwszym problemem jest abstrakcja. Pomyśl o prostym drop-down na przykład. Jeśli chcemy ponownie użyć kodu dla rozwijanego menu, musimy jakoś go zedytować. Teraz sprawdź powyższą listę, nawet to proste wejście dotyka wszystkich trzech warstw aplikacji MVC. W jaki sposób można streścić coś, co ma być podzielone na trzy różne części?

Drugim problemem jest różnorodność funkcji. Biblioteki formularzy nigdy nie rozwiązują wszystkich problemów napotykanych przez deweloperów w ich codziennym życiu. Zatem wszystkie te warstwy i mechanizmy abstrakcji muszą być rozszerzalne, abyś mógł sprawić, by zachowywały się dokładnie tak, jak chcesz.

Będąc rozszerzalnym, komponent Form już rozwiązuje setki drobnych problemów, o których już nawet nie trzeba myśleć. Jak wprowadzać daty, jak wybrać jedną lub wiele list opcji za pomocą różnych interfejsów użytkownika (listy rozwijane, pola wyboru, przyciski opcji itp.), Jak chronić formularze ponownie lukami w zabezpieczeniach i wiele innych są tematami, które mogę napisać esejami o.

Widzisz, że biblioteki formularzy okazują się dość skomplikowane. Najlepszym sposobem na napisanie takich "masywnych przerażających bestii" jest uczynienie ich API tak prostym, jak to tylko możliwe dla początkujących, jak najbardziej elastycznym dla bardziej zaawansowanych użytkowników i napisanie obszernej dokumentacji na temat wykorzystania jej pełnej mocy. Ostatniego punktu zdecydowanie brakuje (please help!), ale ciągle pracujemy nad wszystkimi powyższymi.

Zredukowanie kompleksu do prostego problemu, z drugiej strony, niestety nie jest możliwe.

A co z innymi bibliotekami formularzy, które są o wiele prostsze? Moim skromnym zdaniem, nie próbują one rozwiązać większości problemów, które komponent Symfony2 Form już rozwiązał. :)

Aktualizacja 24 stycznia 2014: Dla każdego, kto chce wiedzieć więcej (o wiele więcej), oto a paper that I published on the subject.

+0

Czy mógłbyś przemyśleć, co uważasz za * model domeny *? Jeśli w ogóle, komponent formy Symfony stymuluje anemiczne modele ... –

+0

Pozwól mi wyjaśnić, o co proszę. Mówisz na przykład: ** Formularze replikują strukturę twojego modelu domeny (DM). ** Nie mogłem mocniej się z tobą nie zgodzić. Powinny umożliwić modyfikację modelu domeny poprzez wykonanie metod reprezentujących zachowanie. Umieszczenie modelu domeny w formularzach jest jednym z najgorszych założeń, na których opiera się komponent Form. –

+1

Miałem na myśli strukturę informacyjną. Jeśli Twój model domeny modeluje "pracowników" i masz formularze do modyfikacji danych tych pracowników, najprawdopodobniej będziesz musiał dostosować formularze, jeśli zmieni się struktura informacji w twoim modelu domeny (np. Usuniesz datę urodzenia, ale zamiast tego dodasz numer ubezpieczenia społecznego;). –