Czy w aplikacji MVC kontroler lub model powinien obsługiwać dostęp do danych? [zamknięte]

zamknięte . To pytanie jest oparte na opinii . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Zaktualizuj pytanie, aby mogło być odpowiedź z faktami i cytatami przez edytując ten post .

Zamknięte 2 lata temu .

Popraw to pytanie

Prowadzimy w naszej firmie dyskusje filosoptyczne na temat tego, gdzie powinny być wywołania do logiki biznesowej, aby wykonać operacje CRUD.

Uważam, że Model powinien składa się z struktury danych i że administrator powinien być odpowiedzialny za wypełnianie danych.

Mój współpracownik uważa, że cała populacja powinna być wykonana w samej klasie modelowej i po prostu wywoływana przez kontrolera. Dzięki temu kontroler jest schludny i czysty(ale moim zdaniem zaśmieca model).

Uważa również, że każde wywołanie zwracające obiekt Json powinno mieć miejsce w modelu, a nie w kontrolerze. Model zwróci tablicę do kontrolera, który następnie zwróci to jako obiekt Json.

Jakie są różne plusy / minusy dla każdego i czy istnieje dobry lub zły sposób, aby to zrobić?

Author: Scottie, 2012-10-02

5 answers

Cała logika biznesowa powinna być w modelu .

Pamiętaj, obowiązki każdej warstwy są zatem:

  • Controller-mostek pomiędzy modelem a widokiem. Decyduje Gdzie iść dalej .
  • widok-wyświetla dane, gromadzi dane wejściowe użytkownika
  • Model-logika biznesowa, interfejs do przechowywania danych.

Jednym z największych zysków jest utrzymanie i (Później) ekspansja. Ogólnie:

  • jeśli chcesz zmienić logikę biznesową, nie należy modyfikować kontrolera ani widoku.
  • jeśli zmienisz wyświetlacz wizualny, nie musisz modyfikować modelu lub kontrolera.
  • jeśli zmienisz swój obieg pracy, nie musisz modyfikować widoku ani modelu.

Aby wykonać powyższe, każda warstwa nie powinna mieć wiedzy o innych, aby działać prawidłowo. Na przykład widok powinien odbierać swoje dane i nie musi nic wiedzieć o tym, skąd pochodzi, aby je wyświetlić jak należy. Kontroler nie powinien wiedzieć nic o podstawowej strukturze modelu, aby wejść z nim w interakcję. Model nie powinien mieć wiedzy na temat sposobu wyświetlania danych (np. formatowania) ani przepływu pracy.

" uważa również, że każde wywołanie zwracające obiekt Json powinno mieć miejsce w modelu, a nie w kontrolerze. Model zwróci tablicę do kontrolera, który zwróci ją jako Json obiekt."

Nie. Model nigdy nie powinien formatować danych. Nie powinien również odczytywać sformatowanych danych. To jest skażenie modelu i przejście do poziomu piekła, gdzie business logic = display logic.

JSON (wchodzenie lub wychodzenie) to tylko kolejny widok. Więc wychodząc:

Data Store -> Model -> Controller -> View

Wejście:

View -> Controller -> Model -> Data Store
 73
Author: BryanH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-10 20:15:19

dla twojej wiadomości, moim głównym językiem jest PHP, więc możesz wziąć to wszystko z przymrużeniem oka.

Logika biznesowa w wzorcach inspirowanych MVC i MVC musi być w warstwie modelu. I tak, model ma być warstwą, a nie klasą lub obiektem.

Większość logiki rezydowałaby w obiektach domeny , ale niektóre z nich trafiałyby do usług , które powinny na przykład być strukturami "najwyższego poziomu" w warstwie modelu, poprzez które warstwa prezentacji (widoki i kontroler) wchodzi w interakcje z warstwą modelu.

Usługi powinny również ułatwiać interakcję między abstrakcjami pamięci masowej (mapery danych, obiekty dostępu do danych, jednostki pracy i/lub repozytoria ) oraz obiekty domeny. Struktury te zajmowałyby się trwałym i czasowym przechowywaniem oraz integralnością danych.

Ten rodzaj separacji upraszcza zarówno konserwację, jak i testowanie bazy kodowej. Zyskujesz możliwość łatwego testowania logiki domeny, bez dotykania bazy danych(lub jakiejkolwiek innej formy przechowywania.

Kontrolery (i równoważne struktury z innych wzorców MVVM i MVP) powinny wydobywać informacje z żądania użytkownika i zmieniać stan warstwy modelu (poprzez pracę z usługami) oraz widok.

Jeśli zaimplementujesz MVP lub MVVM, to Komponenty podobne do kontrolera będą miały dodatkowe obowiązki, w tym transfer danych z warstwy modelu do widok, ale w klasycznych i Model2 wzorcach MVC Widok ma być aktywną strukturą, która żąda danych z warstwy modelu.

Jeśli chodzi o generowanie JSON, to faktycznie powinno się zdarzyć w widoku. widoki powinny zawierać całość (lub Większość, w zależności od sposobu użycia szablonów) logiki prezentacji. Powinien pozyskiwać informacje z warstwy modelu (bezpośrednio lub za pośrednictwem pośredników) i na podstawie tych informacji generować odpowiedź (czasami tworzenie go z wielu szablonów). JSON byłby tylko innym formatem odpowiedzi.


istnieje ogromny wpływ (i głównie - negatywne) przez Rails framework, który został wydany w 2005th. Jego pierwotnym celem było stworzenie frameworka do prototypowania-szybkiego stworzenia kodu odrzucającego. Aby to osiągnąć, uprościli wzór do punktu, w którym rozdzielenie obaw zostało złamane.

zastąpiły warstwę modelu zbiorem aktywnych rejestruj struktury, które można łatwo wygenerować i połączyć funkcjonalność widoku w kontrolerze, pozostawiając szablony jako zamiennik pełnego widoku. Było to idealne rozwiązanie dla początkowego celu, ale kiedy zaczęło się rozprzestrzeniać w innych obszarach, wprowadziło wiele błędnych wyobrażeń na temat wzorców projektowych inspirowanych MVC i MVC, takich jak "widok to tylko szablon" i "model to ORM".

 12
Author: tereško,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Twoje metody kontrolera powinny być tak cienkie, jak to możliwe, co oznacza, że dostęp do danych należy do modelu (a dokładniej do obiektu repozytorium).

Pomyśl o swoich metodach sterowania jak o switch-yardzie... są one odpowiedzialne tylko za delegowanie zadań do innych metod do wykonania.

Jeśli piszesz dowolny kod Linq w kontrolerach, tworzysz zależność, która będzie musiała zostać zmodyfikowana, jeśli zmieni się struktura witryny, i potencjalnie jesteś powielanie kodu dostępu do danych. Ale GetCustomer w modelu jest nadal GetCustomer, bez względu na to, gdzie dzwonisz z kontrolerów. Czy to ma sens?

Logika biznesowa, która jest bardziej rozbudowana niż zwykły dostęp do danych, może być umieszczona we własnej warstwie logiki biznesowej, która jest uważana za część modelu.

Nie jestem pewien co do JSON. JSON jest tylko alternatywną reprezentacją danych; jeśli masz metodę narzędzia, która może przekształcić Twoje klasy danych do JSON, wywołaj GetCustomer z Modeluj i wykonuj transformację do JSON w swojej metodzie kontrolera.
 8
Author: Robert Harvey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-27 17:12:24

Model powinien obsługiwać dostęp do danych.

From MSDN :

Modele. Obiekty modelu są częściami aplikacji, które implementują Logika dla domeny danych aplikacji. Często modeluj obiekty pobranie i zapisanie stanu modelu w bazie danych . Na przykład produkt obiekt może pobierać informacje z bazy danych, operować na niej i następnie zapisz zaktualizowane informacje z powrotem do tabeli produktów w SQL Baza serwerów.

 6
Author: JSK NS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-02 16:16:08

W MVC model odpowiada za obsługę dostępu do danych. Pro polega na tym, że cały kod dostępu do danych jest logicznie zamknięty przez model. Jeśli umieścisz kod dostępu do danych w kontrolerze, będziesz nadmuchiwał kontroler i łamał wzór MVC.

 2
Author: Jordan Denison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-02 16:11:43