Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zagadnienie co do wzorca MVC, Pobieranie danych do widoku.
Przem4S
post
Post #1





Grupa: Zarejestrowani
Postów: 103
Pomógł: 3
Dołączył: 26.07.2010
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif) Pozdrawiam.

Ten post edytował Przem4S 7.03.2012, 21:24:04
Go to the top of the page
+Quote Post
marcio
post
Post #2





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Poprostu masz MVP
Go to the top of the page
+Quote Post
Przem4S
post
Post #3





Grupa: Zarejestrowani
Postów: 103
Pomógł: 3
Dołączył: 26.07.2010
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Mógłby się ktoś jeszcze wypowiedzieć? Ewentualnie odpowiedzieć na moje pytania?
Go to the top of the page
+Quote Post
Sephirus
post
Post #4





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/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... (IMG:style_emoticons/default/questionmark.gif) Gdzie tak piszą(IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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? (IMG:style_emoticons/default/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) (IMG:style_emoticons/default/wink.gif)

Ten post edytował Sephirus 8.03.2012, 09:38:55
Go to the top of the page
+Quote Post
Przem4S
post
Post #5





Grupa: Zarejestrowani
Postów: 103
Pomógł: 3
Dołączył: 26.07.2010
Skąd: Tychy

Ostrzeżenie: (0%)
-----


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ł (IMG:style_emoticons/default/smile.gif) . Pozdrawiam
Go to the top of the page
+Quote Post
Sephirus
post
Post #6





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Ten sposób pokazany przez Ciebie z przekazaniem modelu do widoku też jest ok (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

Wówczas wszystko też jest jak najbardziej zachowane (IMG:style_emoticons/default/wink.gif) Grunt aby widok zajmował się tylko wyświetlaniem wartości, model ich przygotowaniem/pobraniem/zapisem a kontroler tym wszystkim rządził ;P
Go to the top of the page
+Quote Post
marcio
post
Post #7





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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

Ten post edytował marcio 8.03.2012, 10:23:51
Go to the top of the page
+Quote Post
Sephirus
post
Post #8





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat
... and formats it for display in the view.


A od kiedy kontroler formatuje dane do wyświetlenia?

Ten post edytował Sephirus 8.03.2012, 10:21:24
Go to the top of the page
+Quote Post
marcio
post
Post #9





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Bo to nie jest kontroler lecz prezenter (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
Sephirus
post
Post #10





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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ć (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

Ten post edytował Sephirus 8.03.2012, 10:35:31
Go to the top of the page
+Quote Post
marcio
post
Post #11





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Tutaj masz to dobrze opisane.

Chodzi glownie o roznice pomiedzy relacjami kazdej warstwy we wzorcu MVC i MVP
Go to the top of the page
+Quote Post
Sephirus
post
Post #12





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
by_ikar
post
Post #13





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/wink.gif)

Nie mniej, w MVC widok powinien się komunikować z modelem, bez pośrednictwa kontrolera.
Go to the top of the page
+Quote Post
marcio
post
Post #14





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Rozumiec rozumiem ale przeczytaj calosc i spojrz na diagramy.
Go to the top of the page
+Quote Post
Przem4S
post
Post #15





Grupa: Zarejestrowani
Postów: 103
Pomógł: 3
Dołączył: 26.07.2010
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Czyli jak to rozumiec? Np w kohanie kontroler tez przekazuje dane z modelu do widoku.
Go to the top of the page
+Quote Post
marcio
post
Post #16





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
Sephirus
post
Post #17





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 :/
Go to the top of the page
+Quote Post
Przem4S
post
Post #18





Grupa: Zarejestrowani
Postów: 103
Pomógł: 3
Dołączył: 26.07.2010
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Czyli rozumiem do poprawki relacja widoku z modelem.... Czy juz tego nie zmieniac?
Go to the top of the page
+Quote Post
marcio
post
Post #19





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 09:42