Jeden kontroler na stronę lub wiele stron w jednym kontrolerze?


16

Chciałem tylko porady dotyczące sposobu robienia rzeczy w MVC. Używam Codeigniter i zastanawiałem się, czy lepiej mieć jeden kontroler na stronę dla witryny, czy mieć jeden kontroler dla wszystkich stron?

Załóżmy, że mam prostą stronę internetową, na której możesz odwiedzić stronę główną, zalogować się, założyć konto i skontaktować się z administratorem.

  1. Czy lepiej byłoby mieć te kontrolery: frontend (indeks), login, konto, kontakt LUB posiadanie jednego kontrolera o nazwie frontend lub cokolwiek innego z akcjami takimi jak logowanie, createAccount, kontakt?

  2. Kiedy wiesz, czy lepiej jest użyć jednego kontrolera w sytuacji?


Zawsze żyłem według wyznania: Jeden kontroler rządził nimi wszystkimi, a w ciemności związali ich. (Nie bardzo, ale podoba mi się jego dźwięk. :-)
Peter Rowell,

Odpowiedzi:


17

Lepiej mieć kontroler na jednostkę logiczną, na przykład AccountController (logowanie, rejestracja), PagesController (strona główna, kontakt), Backend -> PagesController (tworzenie, edycja, usuwanie), UsersController (tworzenie, edycja, usuwanie) i tak dalej.


Jak reprezentowałbyś stronę internetową z tymi obszarami: strona główna, login, konto, kontakt. Czy użyłbyś 2 kontrolerów jak twój przykład? jeśli przejdziesz do localhost / to otworzysz homecontroler, to jeśli pójdziesz localhost / contact teoretycznie nie powinien to przejść do kontrolera kontaktów? a co masz na myśli przez backend?
Rushino,

To zależy od struktury stron i liczby posiadanych stron. Zrobię HomeController (strona główna, kontakt) lub PagesController (strona główna, kontakt LUB dane szczegółowe (id)). Na przykład w ASP.NET MVC masz domyślny HomeController ze stroną główną i stroną Informacje.
Santas

Podoba mi się ta metoda. Również ClientController (lub jakkolwiek chcesz go nazwać) dla akcji wywoływanych przez Jquery.Ajax, które nie są specyficzne dla żadnej konkretnej części twojej aplikacji. tzn. wielokrotnego użytku z dowolnego z twoich poglądów
Chris

Wydaje mi się właściwą odpowiedzią. CodeIgniter akceptuje podkatalogi dla kontrolerów, które umożliwiają rozdzielenie kontrolerów na strefy, dzięki czemu mogę skończyć z dwoma kontrolerami stron (po jednym na strefę). Dzięki!
Rushino,

Ale czy nie skończyłbyś z dość dużymi kontrolerami, mimo że wszystkie ich działania są względne? Czy to nie problem?
Kid Diamond,

4

@ Rushino Masz tutaj dwie „aplikacje” - front-end (dla czytelników) i backend (dla administratorów). Dla każdej grupy funkcji masz kontroler.

Logowanie to taka grupa, która obejmuje generowanie formularza HTML (pola, wywoływanie widoku) oraz obsługę formularza (sprawdzanie poprawności, połączenie z modelem). Tak więc „login” to kontroler z dwiema czynnościami - generateForm i handleForm.

Strony są podzielone między aplikację frontonu - która po prostu pokazuje strony - i aplikację backendu, która umożliwia edycję, usuwanie, tworzenie i ewentualnie wyświetlanie ich w inny sposób. Strona główna to „tylko kolejna strona” w interfejsie, więc mieści się w kontrolerze stron. Na zapleczu jego logika może być na tyle inna, że ​​uzasadnia to całkowicie inny kontroler.

Dla użytkowników - jeśli użytkownicy mogą się zarejestrować, będą potrzebować kontrolera frontendowego, ale jeśli nie, wszystko, co dotyczy użytkowników, znajduje się w backendie.

Zauważ, że każda z funkcji zaplecza może wymagać zarówno generatora, jak i modułu obsługi. Te rzeczy można jednak podzielić na pliki konfiguracyjne za pomocą wtyczki, która jest generatorem generycznych formularzy.

Podsumowując, wygląda to tak:

Frontend
  Pages
    View, Handle
  Login
    View, Handle
  Users
    Register (note that the handler can be the same as 'create' on the backend)
  Contact
    View
    Handle

Backend
  Users
    Create, Delete, Edit, Update, View
  Pages
    Create, Delete, Edit, Update, View

Poczekaj ... Twoje stwierdzenie, że jedna sekcja reprezentuje jedną aplikację? ciekawy sposób na zrobienie tego (i prawdopodobnie sposób na zrobienie tego). Zastanawiam się, czy Codeigniter zrobi to w ten sposób ... sprawdzi. Muszę mieć pewność, że możesz przechodzić z jednej aplikacji do drugiej bez przerywania jakiejkolwiek sesji lub stanu połączenia.
Rushino,

1
@Rushino CodeIgniter może to zrobić w ten sposób - możesz umieścić foldery w katalogu kontrolerów. Różnica między „aplikacjami” nie jest na poziomie bazy danych / modelu, ale na poziomie kontrolera / widoku. Powodem rozdzielenia jest to, że backend robi bardzo różne rzeczy, często o zupełnie innym projekcie. Pomaga w bezpieczeństwie, ponieważ można ograniczyć IP całego katalogu zaplecza. Pomaga w rozwoju, ponieważ możesz pracować nad backendem bez wpływu na frontend.
Dan wieje

2

Myślę, że powinieneś używać Kontrolera dla każdej jednostki biznesowej, takiej jak OrdersController do wszystkich operacji związanych z zamówieniami i tym podobnych. Zdaję sobie sprawę, że w tym przypadku kontrolery są OGROMNE, ale nadal możemy używać klas pomocniczych do delegowania takich rzeczy, jak inicjalizacja modelu i częściowe klasy do rozłożenia akcji w osobnych plikach.

Na przykład mogę mieć Create.cs and OrdersControllerpliki OrdersController List.cs dla klasy OrdersController każdy z odpowiednim zestawem akcji. Sprawia, że ​​rzeczy są znacznie czystsze i nadal utrzymuje scentralizowane operacje zamówień w jednej klasie kontrolerów.

Tylko moje 2 centy.


0

Myślę, że możesz przyjąć inne podejście:

Jeden główny kontroler jako drzwi wejściowe, który dostarcza zapytanie do określonych kontrolerów. W ten sposób możesz użyć tego kontrolera frontowego, aby sprawdzić typowe rzeczy, takie jak uwierzytelnianie użytkownika, Google Analytics i wszelkie inne ogólne rzeczy, które chcesz zrobić, i utrzymać czystość struktury MVC.

To nie jest mój pomysł, ale Symfony Framework działa w ten sposób, więc mogę powiedzieć, że z mojego doświadczenia jest to naprawdę fajny i elegancki sposób na implementację frontendu.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.