Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> [MVC] Kontroler - gdzie?
thek
post
Post #21





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ja w swoich pracach najczęściej korzystam z modelu wspomnianego przez dr4ko, gdyż jest moim zdaniem w chwili obecnej najbardziej adekwatny do sposobu działania aplikacji webowych, gdyż zgodna z przepływem informacji. User coś robi w widoku i te działania muszą być przechwycone, rozpoznane, a w tym celu powstał kontroler i to on musi zareagować odpowiednimi danymi wyciągniętymi z modelu. Te idelanie, gdyby mozna przesłać z modelu wprost do widoku. Tyle, że to wiązalo by się ze stworzeniem tak modelu, iżw odpowiedzi do widoku szedł by świetnie sparsowany i dostosowany do jego struktury pakiet danych lub widok zmieniał się dostosowując do formy odpowiedzi modelu. A to nie jest w zasadzie możliwe bez wpływu kontrolera. Najlepsze byłoby pełne uniezaleznienie warstw, gdzie każda mogła się odnosić do pozostałych bez konieczności pośrednictwa trzeciej czyli coś w stylu znaczka recycligu ale dwukierunkowego. Tylko czy jest realne do stworzenia takie coś, gdzie choćby model sam sobie wywołuje widok zależnie od danych?
Go to the top of the page
+Quote Post
cojack
post
Post #22





Grupa: Zarejestrowani
Postów: 898
Pomógł: 80
Dołączył: 31.05.2008

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


Cytat(Kikert @ 5.02.2010, 15:07:36 ) *
Czyli bootstrap inicjuje kontroler, kontroler moduły, a na końcu widok, który korzysta np. z echo?


Ciebie można inicjować nie pytaj na co. INICJALIZOWAĆ!

@Zyx nie zgadzam się z Twoją wizją MVC.
Go to the top of the page
+Quote Post
Crozin
post
Post #23





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
@Zyx nie zgadzam się z Twoją wizją MVC.
Nie lubię takich trochę personalnych docinków, ale... nie ma to jak uargumentowana opinia. Poza tym to nie jest wizja Zyxa, tylko założenia tego wzorca (który nie był tworzony z myślą o "środowisku webowym", w którym to ten wzorzec najczęściej jest skopany).
Go to the top of the page
+Quote Post
marcio
post
Post #24





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

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


Cytat
Nie lubię takich trochę personalnych docinków, ale... nie ma to jak uargumentowana opinia. Poza tym to nie jest wizja Zyxa, tylko założenia tego wzorca (który nie był tworzony z myślą o "środowisku webowym", w którym to ten wzorzec najczęściej jest skopany).

A gdzie tak jest napisane ze jest dobrze jak to on mowi na wiki na temat MVC pisza inaczej chyba ze mam problemy z czytaniem.
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #25





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


Cytat(marcio @ 13.02.2010, 15:25:12 ) *
A gdzie tak jest napisane ze jest dobrze jak to on mowi na wiki na temat MVC pisza inaczej chyba ze mam problemy z czytaniem.

Chyba masz problemy z czytaniem: http://en.wikipedia.org/wiki/MVC_Pattern#Overview
A konkretniej zdanie "A view queries the model in order to generate an appropriate user interface".

Osobną kwestią jest to, że wikipedia to nie zbyt wiarygodne źródło, zwłaszcza jeśli chodzi o takie informacje.

Prosty przykład w MVC jaki serwuje ZF, symfony i inne frameworki:
Chcemy pobrać stronicowaną listę elementów modelu, w kontrolerze (lub też w modelu) tworzymy obiekt paginatora, mówimy mu aby pobrał takie i takie elementy. Kontroler przekazuje paginator do widoku, który wyświetla to co w nim jest.

Konsekwencje: kontroler miesza się w warstwę prezentacji, bo to widok na podstawie modelu powinien decydować o tym czy dane są stronicowane i co ile. Chcemy zmienić liczbę wyświetlanych elementów lub wyłączyć stronicowanie, paradoksalnie musimy edytować kontroler - widok i kontroler wcale nie są niezależne.

W implementacji podanej przez @Zyxa to inaczej wygląda, w widoku (na podstawie danych zawartych w modelu) zachodzi decyzja czy dana lista ma być stronicowana, czy też nie. Kontroler jedynie mówi: ten i ten widok ma wyświetlić ten i ten model, nie mówi jak ma go wyświetlić, czy to ma być paginowalna lista, czy też nie. W tej implementacji MVC widok ma więcej zadań i w przeciwieństwie do znanych frameworków dla php potrzebnych będzie wiele klas widoku do różnych zadań.

Bezpośrednie powiązanie między widokiem, a modelem jest widoczne zwłaszcza w aplikacjach desktopowych, przykładowo Java i implementacja swingowej tabeli. Klasa JTable - widok, jest też jakaś klasa odpowiedzialna za model tabeli (nie pamiętam nazwy, pewnie JTableModel (IMG:style_emoticons/default/tongue.gif) ). Model przekazuje się bezpośrednio do konstruktora JTable, to widok bezpośrednio pobiera sobie dane z modelu, model może poinformować widok o tym, że zaszła w nim jakaś zmiana, a widok odświeży się (wzorzec obserwatora - pisał o tym @Zyx) - w aplikacjach www taki feature nie jest potrzebny gdyż http jest protokołem synchronicznym. Aplikacje dektopowe, a aplikacje internetowe to całkowicie dwie różne rzeczy, w aplikacjach www (mówię tutaj o frameworkach php) utarło się że to kontroler jest bliżej modelu niż widok, który służy tylko do prezentacji danych. Ma to swoje plusy oraz minusy.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #26





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




@Zyx - Co do pobierania danych przez widok: http://www.apostrophenow.com
Szczególnie polecam manual dla developerów.

Pozdrawiam
Go to the top of the page
+Quote Post
marcio
post
Post #27





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

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


Jak dla mnie to kontroler powinien zawierac cala logike kodu a widok tylko czesc prezentacyjna.
Cytat
Kontroler jedynie mówi: ten i ten widok ma wyświetlić ten i ten model, nie mówi jak ma go wyświetlić, czy to ma być paginowalna lista, czy też nie. W tej implementacji MVC widok ma więcej zadań i w przeciwieństwie do znanych frameworków dla php potrzebnych będzie wiele klas widoku do różnych zadań.

No wlasnie ja tak mam mam glowny widoku komponentu news a w nim miejsce dla paginacji jesli paginacja jest to tylko podpinam pod dana zmienna z szablonu widok paginacji i po wtokach nie musze ingerowac w kod modelu.
Go to the top of the page
+Quote Post
WiruSSS
post
Post #28





Grupa: Zarejestrowani
Postów: 83
Pomógł: 7
Dołączył: 3.02.2007

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


Witam

Przepraszam, że odświeżam wątek, ale to chyba jedyny w języku polskim, gdzie jest dość głęboko poruszony ten temat.

Mam straszny mętlik, przez te wszystkie niejasności naprawdę zastanawiam się, czy nie zaniechać próby zastosowania.

Ogólnie chciałem zacząć programować, nie wiem czy z wykorzystaniem poprawnego modelu MVC czy nie, ale chyba w sposób podobny jak większość osób pojmuje MVC czy pseudo-MVC.

Więc:

Mam sobie plik index.php (z tego co wyczytałem powinienem nazywać go bootsraper czy jakoś tak). Daruję sobie jednak te wszystkie ładnie brzmiące pojęcia, niezrozumiałe dla 90% ludzi chcących cokolwiek z tego wszystkiego zrozumieć, więc wybaczcie (IMG:style_emoticons/default/biggrin.gif) . Wracając do tego jak ja chciałbym tworzyć swoje aplikacje. Plik index.php, który w moim przypadku jest plikiem, gdzie są same includy.

Teraz chcąc być zgodny z MVC czy pseudo-MVC, tylko bardziej po swojemu (IMG:style_emoticons/default/tongue.gif) , tworzę sobie 3 foldery _views, _controllers, _models.
Jak już wcześniej pisałem zdaję sobie sprawę, że samo MVC jest różnie interpretowane ale jakąś koncepcję muszę przyjąć więc przyjąłem taką:

_views - zawiera czyste pliczki html z wstawionymi danymi z modeli
_models - zawiera klasy z samymi zapytaniami do bazy czy odwolaniami do plików textowych, obrazkowych czy jeszcze innych, gdzie znajduja się jakiekolwiek dane
_controllers - zawiera klasy sterujące danymi i wysyłające je do odpowiednich widoków.

Bardzo chciałbym trzymać się przyjętej przeze mnie ideologii, jednak już w zasadzie na początku napotkałem na dość prozaiczne problemy.

Weźmy sobie ot taki prosty przykład jak menu, ktore widok powinien pokazać w taki sposób:

  1. <nav>
  2. <ul>
  3. <li><a href="link.html">link</a></li>
  4. <li><a href="link2.html">link2</a></li>
  5. <li><a href="link3.html">link3</a></li>
  6. <li><a href="link4.html">link4</a></li>
  7. </ul>
  8. </nav>


i teraz co zrobić, żeby pętelka wyświetliła mi te wszystkie
  1. <li></li>
...widzę 3 wyjścia i nie wiem które powinienem zastosować, każde wg mnie albo odbiega od przyjętego przeze mnie wzorca, albo komplikuje niepotrzebnie i rozdrabnia widoki:

przypadek 1: wewalam część kontrolera do widoku (dokładnie kod pętli) jednak cały kod html dzięki temu jest w widoku
przypadek 2: pętelka zostaje w widoku, jednak część kodu html
  1. <li><a href=""></a></li>
musi się znaleźć w kontrolerze.
przypadek 3: tworzę osobny, malutki widok
  1. <li><a href=""></a></li>
i teraz kontroler przy każdym kroku pętli korzysta z tego widoku, po czym na koniec całość wysyła do widoku menu.

Wg mnie żadne z tych rozwiązań nie jest poprawne i ciekawi mnie czy jest jakieś inne wyjście, które pozostanie zgodne z przyjętym przeze mnie wzorcem.

Jest jeszcze 4 przyadek gdzie ten kawałek html jest w modelu ale to też wydaje mi się bez sensu.

Bardzo proszę napraowadźcie mnie jak prawidłowo powinno się to zrobić, po kilku dniach próby zrozumienia o co w tym wszystkim chodzi, coraz bardziej utwierdzam się w przekonaniu, że albo nie nadaję się na webmastera i nie powinienem się wogóle nim określać, albo po prostu coś tutaj nie do końca jest przemyślane, lub wogólę nie pojmuję idei rozdzielenia poszczególnych warstw.

PS. Przepraszam, za tak prozaiczny przykład jednak myślę, że zbyt dużo czytamy w artykułach "ciężkich" tekstów z trudnymi przykładami i dlatego też wiele osób rezygnuje z prób dostosowania się do jakichkolwiek ogólnie przyjętych standardów. Bardzo bym chciał, żeby pojawiało się więcej bardzo prostych przykładów opisanych prostym językiem, bez zbednych niezrozumiałych terminów. Jakby ktoś był tak miły i spróbował przedstawić swoją interpretację MVC, jednak na konkretnym bardzo prostym przykładzie, choćby wyswietlenia prostego menu to już wogóle było by bosko (IMG:style_emoticons/default/smile.gif)

dziękuję za uwagę i przepraszam jeśli moja wypowiedź nie jest na poziomie tego forum.

Ten post edytował WiruSSS 22.03.2012, 02:41:29
Go to the top of the page
+Quote Post
viking
post
Post #29





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

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


PHP jest stosowane w widoku do prostego wyświetlania danych. Czyli pętla będzie prawidłowa. Ale lepiej by było gdybyś zastosował jakiś system szablonów np http://phptal.org gdzie ten kod miałby postać:
  1. <ul>
  2. <li tal:repeat="x y"><a tal:content="x.id"/></li>
  3. </ul>


Załóżmy. Czytelne, w postaci XMLowej i jeszcze z parsowaniem poprawności.
Go to the top of the page
+Quote Post
thek
post
Post #30





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Najprostsze rozwiązanie? Kontroler przekazuje do widoku tablicę (lub jakąkolwiek formę kolekcji). Elementy tej tablicy (kolekcji) też są tablicami (lub obiektami) i zawierają adres oraz anchor linku. Widok zawiera pętlę wyświetlającą:
Przykładowo:
W kontrolerze masz obiekt widoku, który ma składową odpowiedzialną za linki w menu:
  1. $view->links = array(
  2. array('link' => 'http://www.link1.com', 'anchor' => 'tekst1'),
  3. array('link' => 'http://www.link2.com', 'anchor' => 'tekst2'),
  4. array('link' => 'http://www.link3.com', 'anchor' => 'tekst3')
  5. );

W widoku masz do niej dostęp i możesz w pewnym jej fragmencie dać takie użycie:
  1. <ul>
  2. <?php
  3. foreach($links AS $link)
  4. {
  5. ?>
  6. <li><a href="<?php echo $link['link']; ?>"><?php echo $link['anchor']; ?></a></li>
  7. <?php
  8. }
  9. ?>
  10. </ul>
Tyle, że to nie jest już ściśle rzecz mówiąc MVC ale MVP. Nie ma tu bowiem tyle kontrolera, co prezenter, który pobiera dane z modelu i wrzuca do widoku.
Go to the top of the page
+Quote Post
WiruSSS
post
Post #31





Grupa: Zarejestrowani
Postów: 83
Pomógł: 7
Dołączył: 3.02.2007

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


tak myślałem robić jednak mam odczucie że taki sposób jest jużniezgodny z samym MVC. Co do systemu szablonów może kiedyś się przkonam, jak narazie chciałbym korzystać z jak najmniejszej potrzebnej liczby rozszerzeń.
Go to the top of the page
+Quote Post
viking
post
Post #32





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

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


Tylko pamiętaj że szablony są i tak kompilowane do czystego kodu PHP. Tylko dla jednej odsłony będzie więcej przetwarzania. A porównaj sobie kod obu przedstawionych rozwiązań i pomyśl że masz do przedstawienia coś bardziej zaawansowanego niż tylko ta jedna lista. Później jest taki bajzel że nie da się nad tym panować. Już nie mówiąc że te dane będziesz musiał jeszcze owinąć w htmlentities().
Go to the top of the page
+Quote Post

2 Stron V  < 1 2
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: 13.06.2026 - 16:55