Czy dobrą praktyką jest wywoływanie funkcji kontrolera z innego kontrolera?

23

Mam przypadek, w którym obsługuję logikę wyszukiwania w jednym kontrolerze i generuję pewne dane na podstawie wyszukiwania i zwracania jako statystyki.

Czy dobrą praktyką jest wywoływanie funkcji kontrolera z innego kontrolera? Czy dwóch kontrolerów nigdy nie powinno „rozmawiać”?

IAmJulianAcosta
źródło

Odpowiedzi:

24

Jest to dość dziwne, chociaż odpowiedź zależy od używanego języka / frameworka, ponieważ różne języki / frameworki mają odmienne podejście do MVC.

Zasadniczo nie będziesz używać jednego kontrolera od drugiego, ponieważ:

  • Kontrolery zwykle zwracają wynik typu przeznaczonego do użycia przez środowisko MVC. Ten wynik zawiera wiele informacji, których Ty jako rozmówca nie potrzebujesz (takich jak nazwa widoku) i nie zawsze ułatwia dotarcie do informacji, które mogą Cię zainteresować (w Twoim przypadku model, jeśli tak sądzę).

  • Kontrolery nie są łatwe do inicjowania z kodu biznesowego, ponieważ często potrzebują pewnej ilości informacji na temat żądania HTTP i kontekstu. Wszystkie te informacje powinny zostać przekazane przez środowisko MVC.

Co ważniejsze, jeśli potrzebujesz kilku wyników wyszukiwania w dwóch kontrolerach - jednym, który pokazuje wyniki użytkownikowi końcowemu, drugiemu, który generuje statystyki, po prostu umieść logikę wyszukiwania w warstwie biznesowej (gdzie należy ona w pierwszej kolejności, przy okazji) i utrzymuj kontrolery tak małe, jak to możliwe.

Rolą kontrolera w MVC jest koordynacja procesu:

  • Uzyskaj odpowiedni wkład z żądania,
  • Przekazanie zatwierdzającym zadania sprawdzania poprawności / dezynfekcji danych wejściowych,
  • Nazwij odpowiednie metody warstwy biznesowej,
  • Podaj frameworkowi MVC model wynikowy i widok.

Rolą kontrolera nie jest zajmowanie się logiką biznesową.

Po przeniesieniu kodu do warstwy biznesowej możesz następnie udostępnić interfejs wyszukiwania, który może być ponownie użyty w przejrzysty i prosty sposób, w przeciwieństwie do jednego kontrolera używanego z drugiego.

Arseni Mourzenko
źródło
Cześć, dziękuję za odpowiedź. Zakładając, że przeniosłem logikę wyszukiwania na warstwę biznesową, gdzie najlepiej umieścić interfejs wyszukiwania? Używam Laravela.
IAmJulianAcosta
Niestety, nigdy nie korzystałem z Laravela. Co więcej, wyobrażam sobie, że odpowiedź będzie bardziej zależeć od architektury twojej aplikacji niż od jej struktury.
Arseni Mourzenko,
Zakładając, że znajdujesz się w folderze http dokładnie na jednym poziomie z projektem głównym. Tutaj możesz utworzyć folder o nazwie umowa i wszystkie swoje pliki, które pełnią rolę interfejsu, który możesz tutaj umieścić
Faris Rayhan