Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php]MVC i struktura aplikacji
MadHatter
post 23.06.2007, 22:55:16
Post #1





Grupa: Zarejestrowani
Postów: 20
Pomógł: 1
Dołączył: 15.02.2007

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


Hej,

Mam takie pytanie, starm sie napisac strone stosujac wzorzec MVC, stosuje przy tm Smarty i Peara ale to nie wazne. Glowny problem dla mnie tkwi w teorii samego rozwiazania. Otoz jesli chodzi o sterowanie kacja to jest niby wszystko dosc proste ale nie wiem czy zalozenie dobrze rozumiem. Wysiwetlenie strony polega na tym ze zmianie ulega tytul, dane ktore pojawiaja sie w dziale content, tlo strony i boczne menu. Nie wiem wiec czy stosowac i pisac osobne akcje dla kolejnych odslon, czy napisac jedna mmetode klasy Controllera, pobierajaca odpowiednie parametry. Nie chce tutaj podawac kodu, ktory juz napisalem, bo jest go dosc sporo, ale powiem tylko ze obecnie lacze klasy modelu, akcji i widoku z instrukcja switch-case w indexie i wlasnie nie wiem czy teoretycznie jest to zgodne z zalozeniami MVC. Dodam ze nie zalezy mi narazie na optymalizacji skryptu a raczej na zglebieniu samej teorii.

Dzieki i pozdrawiam.

Ten post edytował MadHatter 24.06.2007, 02:03:50
Go to the top of the page
+Quote Post
Strzałek
post 24.06.2007, 09:16:08
Post #2





Grupa: Przyjaciele php.pl
Postów: 384
Pomógł: 6
Dołączył: 11.09.2004
Skąd: Grodzisk Mazowiecki

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


Wzorce to nie są sztywne założenia że musi być tak i koniec. Są to ... wzorce. Każdy może implementować je inaczej i właśnie to jest w tym najfajniesze.

Więc weźmy na warsztat MVC. Wzorzec mówi nam o tym że aplikacja dzieli się na trzy warstwy - Model, Widok i Kontroler. Oddzielenie tych warstw od siebie daje nam dużą wygodę, by z biegiem czasu odkrywać kolejne plusy tego rozwiązania. A jak to zaprogramujesz? To już zależy od Ciebie. Ja kiedyś rozwiązałem to bardzo prosto, działało szybko i prosto. Mianowicie aplikacja składała się z 3 folderów, Controller, Model i View.

W Controller było np. NewsController, z metodami showAll(), showOne(), archive().

Model przechowywał modele - NewsContainer, z metodami getAllNews, getById().

Natomiast w View były zwykłe szablony php.

Potraktowałem to bardzo luźno i uważam że tak powinno się traktować wzorce.
Dlatego zrób jak uważasz. Jak Ci jest wygodnie. Oczywiście pamiętaj by oddzielić 3 warstwy od siebie, jednak nie rób czegoś na siłę - np. tego że muszą być akcje czy coś tam jeszcze ciekawego.

Możesz ewentualnie podpatrzeć rozwiązania jakie są zastosowane w frameworkach np. agavi.

Pozdrawiam.


--------------------
Go to the top of the page
+Quote Post
envp
post 24.06.2007, 09:55:55
Post #3





Grupa: Zarejestrowani
Postów: 359
Pomógł: 1
Dołączył: 16.04.2006
Skąd: Łódź

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


Cytat
Natomiast w View były zwykłe szablony php.


Nie zgodze się z tym. W wielu fw. szablony sa traktowane jako widok, a nie powinny. Jest to oczywiście "pójście na łatwiznę". Chodzi o to, że jeżeli generujemy sobie www to jest ok, ale jak ma dojsc do generacji PDF, czy XML' a ? Chyba nie bardzo już by działało. Zadaniem kontrolera jest podać do warstwy widoku dane, jego nie interesuje w jaki sposob widok je wyświetli - Jak mu sie zachce wygeneruje z tymi danymi PDF, a jak ie to wgra szablon i wygeneruje (X)HTML'a...
Go to the top of the page
+Quote Post
Strzałek
post 24.06.2007, 10:03:44
Post #4





Grupa: Przyjaciele php.pl
Postów: 384
Pomógł: 6
Dołączył: 11.09.2004
Skąd: Grodzisk Mazowiecki

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


Owszem tak zrobiłem, bo tak było mi wygodnie i szybko. Nie potrzebowałem generowania fikuśnych rzeczy. Ja nie zgodzę się że:

Cytat
W wielu fw. szablony sa traktowane jako widok, a nie powinny


Nie zgodzę się bo to w sumie jest nie prawda. Czemu nie powinny? Widok to warstwa prezenacji, a plik php z html jak najbardziej nim jest. A to że nie będę miał opcji generowania PDFów, XML itp to inna para kaloszy.

Jednak jak najbardziej jest to poprawne.

Zresztą, dyskusja na temat MVC jest w odpowiednim dziale i tam zapraszam zainteresowanych winksmiley.jpg Chyba że autor ma jakieś nie jasności u siebie w projekcie.


--------------------
Go to the top of the page
+Quote Post
MadHatter
post 24.06.2007, 11:14:57
Post #5





Grupa: Zarejestrowani
Postów: 20
Pomógł: 1
Dołączył: 15.02.2007

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


Dziekuje za odpowiedzi. Nie chce robic offtopa, jesli to zly dzial, ale jak zaczalem pytac, to poprostu chodzi o to czy dobrze rozumiem idee MVC, czy np. instrukvja case, ktora podaje pod spodem a ktora znajduje sie w pliku index, powinna byc wlasnie tam, a jesli nie to jakie miejsce jest najbardziej odpowiednie dla niej. Mam obawe wpychania jej w metode jakiejs klasy, z tego wzgledu ze zdaje mi sie iz klasy powinny byc jak najbardziej ogolne(tylko wzorami dla obiektow), jesli wiec w klasie umiescilnbym tak szczegolowe parametry $tablica settings, to czy nie kluci sie tym samym z zalozeniami elastycznosci OOP. Wybaczcie prostote kodu, wolalem spytac, zanim klasy nie roznasnal sie bardziej tracac czytelnosc.

Plik index.php:
  1. <?php
  2. $page=$_GET['page'];
  3. $id=$_GET['id'];
  4.  
  5. switch($page){
  6. case 'contact-address':
  7. $settings['tableName']='kontakt_dane';
  8. $settings['title']='dane teleadresowe';
  9. $settings['cNum']=2;
  10. $settings['background']='address_bg.jpg';
  11. $settings['specialQuery']='SELECT * FROM '.$settings['tableName'];
  12. break;
  13. // Pozostale opcje switch;
  14. $view->setLayout($settings);
  15. $view->displayLayout('main.tpl');
  16. ?>


i klasa view:
  1. <?php
  2. class MVCView{
  3. public $smarty;
  4. public function __construct(){
  5. $this->smarty=new Smarty();
  6. }
  7. public function setLayout($settings){
  8. $this->smarty->assign('title',$settings['title']);
  9. $this->smarty->assign('background',$settings['background']);
  10. $this->smarty->assign('cNum',$settings['cNum']);
  11. $this->smarty->assign('leftCol', $settings['leftCol']);
  12. $this->smarty->assign('createLinks', $settings['createLinks']);
  13. $this->smarty->assign('leftMenuLink', $settings['leftMenuLink']);
  14. $this->smarty->assign('rightCol', $settings['rightCol']);
  15. $this->smarty->assign('includeImages', $settings['includeImages']);
  16. $this->smarty->assign('imagesResults', $settings['imagesResults']);
  17. $this->smarty->assign('mainMenuLink',$settings['mainMenuLink']);
  18. }
  19. public function displayLayout($layout){
  20. $this->smarty->display($layout);
  21. }
  22. }
  23. ?>


Dzieki i pozdrawiam!
Go to the top of the page
+Quote Post
Ludvik
post 24.06.2007, 11:32:18
Post #6





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Mieszasz ze sobą warstwy modelu i kontrolera.
  1. <?php
  2. $settings['tableName']='kontakt_dane';
  3. $settings['title']='dane teleadresowe';
  4. $settings['cNum']=2;
  5. $settings['background']='address_bg.jpg';
  6. $settings['specialQuery']='SELECT * FROM '.$settings['tableName'];
  7. ?>

To są szczegóły związane z wyświetlaniem i pobieraniem danych. Pobieranie jest związane z warstwą modelu, a wyświetlanie z widokiem. Kontroler nie ma prawa wiedzieć nic o zapytaniach do bazy czy tytule strony. On ma wywołać akcję, która pobierze dane i zwróci je (za jego pośrednictwem) do widoku. Czyli:
  1. Pobierasz nazwę akcji na podstawie URL żądania
  2. Uruchamiasz akcję (np. wzorzec Command)
  3. Akcja pobiera dane i zapisuje je w jakimś kontenerze (np. tablica)
  4. Dane zostają zwrócone do kontrolera.
  5. Kontroler przekazuje dane do widoku.
  6. Widok obrabia dane, dostosowuje je do interfejsu uzytkownika i zwraca wynik przetwarzania.
Najważniejsze jest to, żeby kontroler i widok nie wiedziały jak i skąd zostaną pobrane dane. Warstwa danych natomiast nie ma pojęcia jak zostaną wyświetlone.

Ten post edytował Ludvik 24.06.2007, 11:32:47


--------------------
Go to the top of the page
+Quote Post
MadHatter
post 25.06.2007, 10:51:20
Post #7





Grupa: Zarejestrowani
Postów: 20
Pomógł: 1
Dołączył: 15.02.2007

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


Hej,

Dzieki za odpowiedz. Napisze juz super szybko zeby nie truc:

Problem w tym, ze normalnie za wyswietlanie strony powinna byc odpowiedzialna jaksa akcja. Poszczegolne odslony, nie zmieniaja, sie z wyjatkiem tego co wypluwa baza danych, iloscia kolumn, rlem i tematem(to widac w tablicy $settings z mojego postu). Niestety tabele sa tak dziwnie zrobione, ze nie mozna napisac prostej metody modelu, lub kilku i je wywolywac, Wlasciwie kazdy dzial ma niestety inna tabele, inne nazwy pol(bez ladu zadnego), w zwiazku z tym zastanawiam sie czy do kazdje strony(odslony) powininenm napisac inna akcje, bo w przeciwym razie wyghlada na to ze pozostaje mi takie wlasnie mieszanie widoku z modelem i kontrolerem o jakim napisales lsusznie...

Pozdrawiam!
Go to the top of the page
+Quote Post
Ludvik
post 26.06.2007, 11:36:50
Post #8





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Skoro na każdej stronie wykonujesz różne czynności, to za każdą czynność odpowiada inna akcja. Każda z nich zwraca jakiś zbiór danych, który następnie trafia do widoku. Widok możesz zrobić bardzo prosty: kontroler (z pomocą modelu) wybiera odpowiedni widok. Jeżeli masz elementy wspólne na wszystkich stronach, możesz zagnieździć szablon w drugim, ogólniejszym.

Zauważ, że w każdej akcji operujesz na danych tak jak chcesz... Zwracasz tylko zbiór danych, który ma być wyświetlony...


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 18:44