Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zagadnienie co do wzorca MVC
Forum PHP.pl > Forum > PHP > Object-oriented programming
Przem4S
Mianowicie czy dopuszczalne jest coś takiego że załóżmy mam kontroler setup:
  1. class Setup extends Controller
  2. {
  3. public function __construct()
  4. {
  5. parent::__construct();
  6. }
  7.  
  8. public function index()
  9. {
  10. // Zainicjowanie zmiennej która zostanie wprowadzona do widoku:
  11. $var = null;
  12. // Załadowanie modelu:
  13. $this -> load -> model('setup');
  14. $model = new Model_Setup; // Przypisanie widoku w kontrolerze
  15. $var['title'] = $model -> get_title();
  16. // Załadowanie widoku i przekazanie do niej zmiennych:
  17. $this -> load -> view('setup', $var);
  18. }
  19. }


Czyli w moim wypadku działa to tak iż Kontroler inicjuje model i widok następnie przepisuje do zmiennej w tablicy funkcję pobierającą dane z modelu i tą że zmienną umieszczam w widoku. Czyli jak by nie patrzeć widok pobiera zmienną z kontrolera a nie bezpośrednio z modelu? Czy ja się już pogubiłem? Praktycznie wszędzie pisze jako że widok ma pobierać dane z modelu, jak to ustosunkować w moim wypadku? Z góry dzięki za odpowiedzi smile.gif Pozdrawiam.
marcio
Poprostu masz MVP
Przem4S
Mógłby się ktoś jeszcze wypowiedzieć? Ewentualnie odpowiedzieć na moje pytania?
Sephirus
Mimo że twoja metoda jest troszeczkę oryginalna to jest w pełni ok.

Założeniem MVC jak wiesz jest oddzielenie M od V i od C tongue.gif

C powiniem miec wiedze i dostęp do M i V ale M nie powinno mieć nic wspólnego z V i na odwrót - chyba że ktoś przekaże M jako zmienna do V ;P

U Ciebie działa to tak, że C zbiera wszystkie dane, powołuje model zbiera z niego dane, następnie przekazuje je do widoku. Z podanego kodu wynika, że wszystko jest ok.

Cytat
Czyli jak by nie patrzeć widok pobiera zmienną z kontrolera a nie bezpośrednio z modelu?


I tak powinno być. To C powinien dane zwrócone przez model przekazać widokowi ... Jak niby model sam miałby je przekazać widokowi... questionmark.gif Gdzie tak pisząquestionmark.gif Oczywiście to są ząłożenia, czasem się je nieco nagina ale zasada jest właśnie taka...

Cytat
Poprostu masz MVP


Ok skąd to się tu wzięło to nie wiem... To nie jest żadne MVP - to jest zwykłe MVC - z kodu wynika że wszelkie obowiązki są zachowane , C nic sam nie wyświetla, przekazuje dane do widoku który to powinien je wyświetlić. Gdzie tu Prezenter?

@Przem4S - wszystko jest ok wink.gif

Dla przykładu jeszcze podam jakiś kawałek kodu zaciągnięty z przykładu kursu dla Zenda. jest to akcja "add" jednego z kontrolerów.

  1. function addAction() {
  2. $this->view->title = "Add New Album";
  3.  
  4. if ($this->_request->isPost()) {
  5. Zend_Loader::loadClass(’Zend_Filter_StripTags’);
  6. $filter = new Zend_Filter_StripTags();
  7.  
  8. $artist = $filter->filter($this->_request->getPost(’artist’));
  9. $artist = trim($artist);
  10. $title = trim($filter->filter(
  11. $this->_request->getPost(’title’)));
  12.  
  13. if ($artist != ” && $title != ”) {
  14. $data = array(
  15. ‘artist’ => $artist,
  16. ‘title’ => $title,
  17. );
  18. $album = new Album();
  19. $album->insert($data);
  20. $this->_redirect(’/');
  21. return;
  22. }
  23. }
  24. // set up an "empty" album
  25. $this->view->album = new stdClass();
  26. $this->view->album->id = null;
  27. $this->view->album->artist = ”;
  28. $this->view->album->title = ”;
  29.  
  30. // additional view fields required by form
  31. $this->view->action = ‘add’;
  32. $this->view->buttonText = ‘Add’;
  33. }


Jak widać kontroler sprawdza wejście, powołuje model, przekazuje jakieś dane do widoku itd... To też nie jest MVC? smile.gif

P.S. Nawiasem mówiąc jeśli robisz ten framework sam - polecam dodawanie do akcji kontrolerów jakiegoś postfixa - na przykład Action tak jak w zendzie - to daje tyle, że wewnątrz wtedy masz rozróżnienie czy dana metoda jest akcją czy zwykłą metodą obiektu kontrolera (której nie można wywołać jako akcji z przeglądarki) wink.gif
Przem4S
Po prostu myślałem że w kontrolerze mam przypisać tylko model do zmiennej i przekazać go do widoku, a w widoku zrobić coś w stylu:
  1. $model -> funkcja_w_modelu();

Ale wtedy wydaje mi się że i tak wszystko opierało by się na kontrolerze który to przekazywałbym model. Po prostu już się pogubiłem czy naginać to jeszcze do wzorca czy jest ok. Ale uzyskałem odpowiedź za którą serdecznie dziękuję. Leci pomógł smile.gif. Pozdrawiam
Sephirus
Ten sposób pokazany przez Ciebie z przekazaniem modelu do widoku też jest ok smile.gif

O ile model nie został powołany w widoku, który to z reguły takimi rzeczami zajmować się nie powinien jednak jeśli model ma na przykład metodę, która zwraca jakąś tablicę to jak najbardziej można przekazać model taki do widoku pod jakąś zmienną i w skrypcie widoku w pętli wyświetlić poszczególne wartości smile.gif

Wówczas wszystko też jest jak najbardziej zachowane wink.gif Grunt aby widok zajmował się tylko wyświetlaniem wartości, model ich przygotowaniem/pobraniem/zapisem a kontroler tym wszystkim rządził ;P
marcio
Cytat
P.S. Nawiasem mówiąc jeśli robisz ten framework sam - polecam dodawanie do akcji kontrolerów jakiegoś postfixa - na przykład Action tak jak w zendzie - to daje tyle, że wewnątrz wtedy masz rozróżnienie czy dana metoda jest akcją czy zwykłą metodą obiektu kontrolera (której nie można wywołać jako akcji z przeglądarki)

Zacznijmy od tego ze jesli taka metoda nie jest akcja kontrolera to bedzie to raczej metoda z zasiegiem protected/private skoro nie ma do niej odwolania przez url to po co ona ma byc w ogole publiczna?!?

Cytat
Ok skąd to się tu wzięło to nie wiem... To nie jest żadne MVP - to jest zwykłe MVC - z kodu wynika że wszelkie obowiązki są zachowane , C nic sam nie wyświetla, przekazuje dane do widoku który to powinien je wyświetlić. Gdzie tu Prezenter?


Cytat z wiki:
Cytat
Widok jest odpowiedzialny za prezentację danych w obrębie graficznego interfejsu użytkownika. Może składać się z podwidoków zarządzających mniejszymi elementami składowymi. Widoki posiadają bezpośrednie referencje do modeli, z których pobierają dane, gdy otrzymują od kontrolera żądanie odświeżenia. Widoki mogą także modyfikować stan modelu, jeśli dana modyfikacja dotyczy sposobu prezentacji danych


Poprostu prezenterem jest wlasnie kontroler, widokiem szablon(zalezy od implementacji) a model to model
MVP wiki:
Cytat
The presenter acts upon the model and the view. It retrieves data from repositories (the model), and formats it for display in the view.

http://nirajrules.wordpress.com/2009/07/18...vs-mvp-vs-mvvm/

Cytat
Grunt aby widok zajmował się tylko wyświetlaniem wartości, model ich przygotowaniem/pobraniem/zapisem a kontroler tym wszystkim rządził ;P

No i wlasnie tu sie chyba mylisz, poczytaj bloz Zyx'a tez wlasnie w MVC kontroler nie pelni roli posrendika

EDIT:
https://github.com/zyxist/Trinity/blob/mast...s/View/Grid.php tak wyglada widok w MVC
Sephirus
Cytat
... and formats it for display in the view.


A od kiedy kontroler formatuje dane do wyświetlenia?
marcio
Bo to nie jest kontroler lecz prezenter wink.gif
Sephirus
Nie o to mi chodziło.

Opisz mi co to jest formatowanie danych do wyświetlenia w widoku?

Czy przekazanie widokowi danych wprost z modelu jest ich formatowaniem?

EDIT:

Co do widoku z trinity - ok tu masz rację tak to powinno wyglądać smile.gif Chodzi też jednak o to jak ludzie to tak naprawdę wykonują, w wielu przypadkach nie robi się takich widoków a korzysta z podstawowego obiektu widoku, który jedynie otrzymuje od nas nazwę pliku ze skryptem, który ma wyświetlić a wszelkie dane dopisywane mu są w obrębie danej akcji kontrolera. Tak to jest w 90% robione na przykład w Zendzie gdzie oczywiście widoki można tworzyć indywidualne ale większość tak po prostu nie robi.

To o co mi chodziło nie wiąże się z samym widokiem w sensie klasy/obiektu - może mogłem to bardziej rozpisać - chodzi mi o skrypt widoku (szablon) - ten kod nie powinien powoływać modeli i się nimi "bawić". Jeżeli idziemy tą drogą gdzie budujemy poszczególne obiekty widoków to jak najbardziej jest to słuszne i wówczas wszystko jest w 100% prawdą. Jednak jeśli (a często tak jest) nie chcemy się w to bawić i korzystamy z domyślnego widoku to przerzucamy tą funkcjonalność na kontroler co nie robi z niego zawsze prezentera smile.gif
marcio
Tutaj masz to dobrze opisane.

Chodzi glownie o roznice pomiedzy relacjami kazdej warstwy we wzorcu MVC i MVP
Sephirus
No właśnie taką jedną znalazłem:

Cytat
One other big difference about MVC is that the View does not directly bind to the Model. The view simply renders, and is completely stateless. In implementations of MVC the View usually will not have any logic in the code behind. This is contrary to MVP where it is absolutely necessary as if the View does not delegate to the Presenter, it will never get called.


Jak to rozumiesz - bo ja już zgłupiałem smile.gif
by_ikar
Cytat
No i wlasnie tu sie chyba mylisz, poczytaj bloz Zyx'a tez wlasnie w MVC kontroler nie pelni roli posrendika


Do 11 kwietnia nie poczyta wink.gif

Nie mniej, w MVC widok powinien się komunikować z modelem, bez pośrednictwa kontrolera.
marcio
Rozumiec rozumiem ale przeczytaj calosc i spojrz na diagramy.
Przem4S
Czyli jak to rozumiec? Np w kohanie kontroler tez przekazuje dane z modelu do widoku.
marcio
Cytat(Przem4S @ 8.03.2012, 12:29:04 ) *
Czyli jak to rozumiec? Np w kohanie kontroler tez przekazuje dane z modelu do widoku.

A tak ze zaden fw symfony/kohana/zend/cake/ci nie implementuja "prawidlowego" MVC.
Sephirus
To nie tak że wszystkie te frameworki tego nie implementują a programiści (na pewno w przypadku Zenda bo pozwala on na takie zarządzanie widokiem jak przedstawiłeś z Trinity) ale tego się raczej tak nie robi... bo tak się przyjęło w nim :/
Przem4S
Czyli rozumiem do poprawki relacja widoku z modelem.... Czy juz tego nie zmieniac?
marcio
Cytat(Sephirus @ 8.03.2012, 13:06:11 ) *
To nie tak że wszystkie te frameworki tego nie implementują a programiści (na pewno w przypadku Zenda bo pozwala on na takie zarządzanie widokiem jak przedstawiłeś z Trinity) ale tego się raczej tak nie robi... bo tak się przyjęło w nim :/

Ze jacy programisci framework z gory narzuca swoja implementacje i tyle.Nie wiem jak to sie ma w Zend ale poprostu wszedzie pisze MVC a to z MVC nie ma az tak duzo wspolnego.Zobacz sobie asp.net mvc

Cytat(Przem4S @ 8.03.2012, 13:19:55 ) *
Czyli rozumiem do poprawki relacja widoku z modelem.... Czy juz tego nie zmieniac?

Nie chodzi o to co trzeba poprawic kazdy pisze jak mu wygodniej i tak jak jego idea przybliza sie w "swiecie" kodu.Niemniej jednak jesli cos nie jest MVC to sie tego na chama tak nie nazywa.
Kazdy wzorzec architektoniczny jest dobry jak inny, kazdy ma swoje zalety i wady.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.