Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [OOP][MVC]Wspolpraca Router i Controller
Forum PHP.pl > Forum > PHP > Object-oriented programming
marcio
WItam na potrzeby wlasne jestem zmuszony nauczyc sie OOP i Mvc poniewaz chce wejsc na praktyke do firmy znajomego ale powiedzial mi ze zanim pomoze mi sie nauczyc jego Framework'a musze poznac dobrze OOP(co jak narazie dobrze mi nie wychodzilo biggrin.gif) i Wzorzec MVC:
Index.php
  1. <?php
  2.  
  3. include_once('config.php');
  4. include_once('base/autoload.php');
  5.  
  6. $control = new BaseController();
  7. echo $control -> code;
  8.  
  9. ?>

I tak wyglada Index tongue.gif a tu 2 klasy ktore powinny mi pomoc w zarzadzaniu wszystkimi modulami jakie maja zostac wywolane i ich akcje:
Klasa Router -> http://rafb.net/p/uvyyUI12.html
Klasa Kontrolera -> http://rafb.net/p/303AWO83.html
W komentarzach opisalem o co mi glownie chodzi nie chcialem wklejac tu kodu bo zauwazylem ze nie zawsze jest on czytelny na forum co moze zniechecic pare osob na krotka analize moje skromnego kodu.

Ogolnie czy jest to good napisane moze dzialac(w sensie generalnym na wieksza skale) czy jest cos co byscie zmienili/poprawili(napewno jest smile.gif).

I mam jeszcze jedno pytanie czytalem prawie wszystkie watki tu na forum i nie tylko dotyczace MVC wiem jak to dziala to ma robic Kontroler/Widok/Model jednak nie wiem zabardzo jak po wywolaniu odpowiedniej klasy i jej akcji pobrac dane za pomoca modelu wyslac do Widoku "obrobic" i zwrocic, u mnie to bedzie dzialalo troche inacze kontroler modulu bedzie pelnil role Modelu bo glowny kontroler ma wszystko robic i potem jest widok.

I mialbym dla was prosbe czy ktos z was moglby zrobic mi przyklad np prostej klasy(Modele) ktory pobierze news i jak mialby wyslac dane(w postaci zmiennych jak narazie bez szablonow) do Widoku zebym tylko zrozumial jak ma to dzialac np:
  1. <?php
  2.  
  3. class front {
  4.  
  5. private $db;
  6. private $sql;
  7. private $output;
  8.  
  9. public function __construct() {
  10.  
  11.  $this -> output = array();
  12.  
  13.  if($this -> db = mysql_connect('****', '*****', '****')) mysql_select_db('marcios');
  14.  
  15. }
  16.  
  17.  
  18. public function ShowNews() {
  19.  
  20.  $this -> sql = 'select * from news limit 3';
  21.  $data = mysql_query($this -> sql, $this -> db);
  22.  
  23. while($tab = mysql_fetch_assoc($data))
  24.  
  25. foreach($tab as $key => $value) $this -> output[$key] .= $value;
  26.  
  27.  return $this -> output; //albo cos innego nie wiem zapis do jakiego pola czy cos
  28.  
  29.  }
  30.  
  31. public function __destruct() {
  32.  
  33.  mysql_close($this -> db);
  34.  
  35.  }
  36. }
  37.  
  38. ?>

I jak no teraz widok ma odebrac dane i je np przeparsowac lub wyswietlic?

P.S oczywiscie Url powinien wygladac: www.costam.pl/index.php/news,ShowNews
LBO
W OOP istnieje takie pojęcie jak "Separation of concerns" - z grubsza oznacza to, że w projektowanym systemie wydzielasz sobie obszary ze sobą nie związane np. do osobnych obiektów.

I tak w najprostszym MVC takimi obszarami są:
1. Obsługa żądania (request)
2. Obsługa tłumaczenia parametrów żądania do poszczególnych akcji (router). Takim parametrem są np. URL i nagłówki HTTP lub parametry w konsoli
3. Obsługa wyszukiwania akcji w strukturze katalogów systemu (dispatcher).
4. Obsługa akcji i powiązanych widoków (controller).
5. Obsługa widoku (view)
6. Obsługa odpowiedzi (response)
7. Obsługa wszystkich powyższych, sklejająca je w całość (front controller).

Pisząc swoje wariacje MVC powinieneś wziąć powyższe pod uwagę. Widzisz więc że twój front controller (BaseController) nie może dziedziczyć po Routerze, bo to co obsługuje router to nie jego działka. Zapamiętaj też nazewnictwo.

Pozdrawiam, Alan

P.S. Nie zaprzeczam, że kilka rzeczy pominąłem smile.gif
Orkan
a tutaj wersja z obrazkami winksmiley.jpg
http://www.symfony-project.org/book/1_2/02...-Symfony-s-Code
marcio
Czyli podsumuwyjac bo nie bardzo rozumiem co macie na mysli?
Orkan
podsumowujac, to moim zdaniem masz troche nie ten teges:

  1. <?php
  2. $this -> request = $Dispatcher = new Dispatcher();
  3. ...
  4. $this -> module = $this -> request -> Dispatcher -> Arrpath['module'];
  5. ?>



ale i tak mysle ze powinienes dac jakiegos gettera w klasie Dispatcher
LBO
Cytat(marcio @ 19.03.2009, 00:22:23 ) *
Czyli podsumuwyjac bo nie bardzo rozumiem co macie na mysli?


Jakbyś mógł konkretniejsze pytanie zadać.
marcio
Cytat(Orkan @ 19.03.2009, 00:33:49 ) *
podsumowujac, to moim zdaniem masz troche nie ten teges:

  1. <?php
  2. $this -> request = $Dispatcher = new Dispatcher();
  3. ...
  4. $this -> module = $this -> request -> Dispatcher -> Arrpath['module'];
  5. ?>


ale i tak mysle ze powinienes dac jakiegos gettera w klasie Dispatcher


Czyli mowisz zeby klasa Dispatcher tez dziedziczyla po Router??
Ale powiec mi w czym moze mi pomoc getter w Routerze bo nie bardzo rozumiem chetnie wyslucham tongue.gif^^

No i powiedz mi jak ty bys zrobil z tym przypisywaniem?


Cytat(LBO @ 19.03.2009, 09:41:39 ) *
Jakbyś mógł konkretniejsze pytanie zadać.

Nom chodzi mi bardziej o konkretniejsze odpowiedzi tongue.gif

Oczywiscie dziekuje za ci @LBO za napisanie wszystkich podpunktow MVC.
pejott
O dzizys, jak Router może dziedziczyć po Dispatcherze?

Poczytaj w necie, na forum, przejrzyj źródła symfony i Zenda, a Ci się troche rozjaśni co jest co.
Gdzieś widziałem artykuł, gdzie było opisane nazewnictwo podstawowych elementów w frameworkach, ale teraz go nie moge znaleźć.
Zresztą, jak przejrzysz archiwum pro to tam są też opisane, chociaż część informacji jest juz przestarzała. ; >
marcio
Cytat
O dzizys, jak Router może dziedziczyć po Dispatcherze?

Przeczytaj ze zrozumieniem co napisalem, bo napisalem na odwrot.

A nazewnictwo nie jest wazne elementy chce nazywac jak mi jest wygodniej w ogolnie moje pytanie bylo inne.
pejott
Hehe, zastanów się co to za różnica ?
marcio
Moze i nie ma ale z tego co napisal @Orkan to wlasnie o to mu chodzilo.
mike
Cytat(marcio @ 19.03.2009, 16:03:42 ) *
A nazewnictwo nie jest wazne elementy chce nazywac (...)
asdfkj sdkl asjdf askjas sdkjfh alsdjfh aksdjhf sgh skaksd a

<ironia>
Nie zrozumiałeś? Trudno, ja tak sobie po prostu ponazywałem słowa tongue.gif
</ironia>

Jeśli zabierasz się za wzorce projektowe to musisz uświadomić sobie po co one powstały. Po to by w jednolity sposób pomóc rozwiązywać różnym ludziom te same problemy w taki sam sposób.
Ustalona, jednolita nomenklatura jest częścią wzorców projektowych. I jak mówisz Router to wszyscy myślą Router.
pejott
Ja nie widzę tam nic na temat dziedziczenia.

Zastanów się, czy pralka dziedziczy po krzaku ?
marcio
No ok ale jesli ktos chce na serio pomoc to chyba czyta i kod ktory jest podany w poscie po ktorym mozna zrozumiec dzialanie klasy Router i ustalenie co ona ma robic i jak powinna sie nazywac ja MVC nie znam ucze sie go wiec nie wiem dokladnie co ma robic router wiec klase tak nazwalem nie trzeba odrazu wyjezdzac z sarkazmem typu: "dzisys"

o co do mojego problemu ktos pomoze?
LBO
Cytat(marcio @ 19.03.2009, 16:27:56 ) *
wiec nie wiem dokladnie co ma robic router


Nie wiesz? A powinieneś:

Cytat(LBO @ 18.03.2009, 23:38:54 ) *
2. Obsługa tłumaczenia parametrów żądania do poszczególnych akcji (router). Takim parametrem są np. URL i nagłówki HTTP lub parametry w konsoli


Po twoich postach mam wrażenie, że liczysz, że ktoś magicznym pstryknięciem palców przekaże Ci pełną wiedzę dot. wzorców projektowych.
Mogę Ci z cała pewnością powiedzieć, że będziesz rozczarowany. Dlatego też poprosiłem o bardziej sprecyzowane pytania, co niestety potraktowałeś bardzo po macoszemu (utwierdzając mnie tylko w tym co piszę teraz).

Co do nazewnictwa. Inżynierowie, omawiając jakąkolwiek specyfikację nie używają słowa wihajster miast kondensator. Tak samo jest w programowaniu.
Cysiaczek
Cytat
WItam na potrzeby wlasne jestem zmuszony nauczyc sie OOP i Mvc poniewaz chce wejsc na praktyke do firmy znajomego ale powiedzial mi ze zanim pomoze mi sie nauczyc jego Framework'a musze poznac dobrze OOP(co jak narazie dobrze mi nie wychodzilo biggrin.gif) i Wzorzec MVC:


Jeśli jesteś zmuszony to źle. Naprawdę polecam "PHP5 Obiekty wzorce narzędzia" jako podstawę do wszelkiej nauki OOP. Zrozum kolegów wyżej - mają dość tłumaczenia komuś czegoś, co może dowiedzieć się sam. Sam musisz to zrozumieć, a to przyjdzie po wielu dniach i nieprzespanych nocach. "Zaskoczysz", to zobaczysz.
Router, to wspólna nazwa dla klas, które mają wspólny interfejs (czyli metody) i wykonują to samo zadanie, tylko na różne sposoby. Chodzi o adresy URL, które jak wiesz mogą wyglądać różnie.
index.php?costam=innecos&kolejnecos=następnecos
/newsy/hello_world
/hello_world.html
/zmienna/wartosc/zmienna2/wartosc2

Co więc robi router? Zamienia adresy URL na konkretne wartości żądania. Takie żądanie składa się z wielu parametrów, ale podstawowe, które występują w praktycznie każdym FW, to moduł i akcja do uruchomienia. Zauważ tylko, że to jest jedyne, co on robi. Nic ponadto. Oczywiście musi jakieś wyniki udostępniać. Te wyniki muszą być rozumiane przez inny obiekt - Dispatcher, który bierze wyniki działania Routera i tłumaczy sobie te parametry na konkretne elementy systemu (pliki, klasy, akcje), po czym uruchamia akcję i przydziela jej zasoby*. Zobacz: http://pl.wikipedia.org/wiki/Dyspozytor
http://hillside.net/plop/plop2001/accepted...ernandez0_1.pdf
Bez solidnej teorii nie ruszysz, pamiętaj o tym!

Pozdrawiam


@LBO - ja tak widzę rolę Dispatchera, choć nie wiem, czy nie dokonuję nadinterpretacji. Można wydzielić jeszcze więcej obiektów przecież smile.gif
marcio
Myslalem nad kupnem tego: http://helion.pl/ksiazki/probph.htm

Ogolnie czytam i czytam ale widze ze te OOP to czarna magia dla mnie tongue.gif nie mowie ze pisac w MVC 100%-centowo ale przynajmniej miec klase do obslugi url, Glowny kontrolele do wywokywania odpowiedniego modulu jego obiektu i metod i do tego miec kontroler i widok kazdego modulu.

Jeszcze poczytam mam nadzieje ze tym razem cos z tego wyjdzie.
Orkan
Cytat(marcio @ 19.03.2009, 17:16:47 ) *
Czyli mowisz zeby klasa Dispatcher tez dziedziczyla po Router??
Ale powiec mi w czym moze mi pomoc getter w Routerze bo nie bardzo rozumiem chetnie wyslucham tongue.gif^^

No i powiedz mi jak ty bys zrobil z tym przypisywaniem?
Nom chodzi mi bardziej o konkretniejsze odpowiedzi tongue.gif

Oczywiscie dziekuje za ci @LBO za napisanie wszystkich podpunktow MVC.


Sam sie ucze MVC i napewno nie jestem ekspertem.
Za to mam inna metode nauki, otoz nie pisze od razu wlasnego modelu, tylko ucze sie od najlepszych (symfony)
Na poczatku bylo ciezko, ale po kilku ksiazkach z cwiczeniami zaczynam lapac o co chodzi, i kazdemu polecam taka droge smile.gif

Co do Twojego kodu (pomijajac wspomniany juz aspekt architektury MVC)
  1. <?php
  2. $this -> request = $Dispatcher = new Dispatcher();
  3. ?>

PHP nie kopiuje obiektow tylko tworzy aliasy, wiec nie jest do konca jasne co tu sie tworzy... powinno byc:
  1. <?php
  2. $this -> request = new Dispatcher();
  3. $this -> module = $this -> request -> Arrpath['module'];
  4. ?>


gettery zapobiegaja "rozszczelnieniu" klasy, dlatego dobrze jest je stosowac. ja bym to napisal tak:
  1. <?php
  2. $this -> request = new Dispatcher();
  3. $this -> module = $this -> request -> getModule();
  4. ?>
LBO
Cytat(Cysiaczek @ 20.03.2009, 19:31:50 ) *
@LBO - ja tak widzę rolę Dispatchera, choć nie wiem, czy nie dokonuję nadinterpretacji. Można wydzielić jeszcze więcej obiektów przecież smile.gif


Nadal mieścisz się w mojej definicji, więc dzisiaj Ci daruję biggrin.gif:D:D ale z linkiem do wiki nie trafiłeś wybitnie tongue.gif

Chociaż mam zastrzeżenia do Routera. Mimo, że się rozpisałeś bardzo zawęziłeś.
Router (różne implementacje oparte o interfejs - dla kolegów, którzy się jeszcze uczą) powinien być w stanie obsłużyć najróżniejsze środowiska.
Dla WWW parametrami powinny być: URL, nagłówki, ciastka, GET i POST. Dla CLI (konsoli) to parametry wywołania i stałe systemowe.... a co tam w dobrze zaprojektowanym systemie nawet z mikrofalówki powinien ruszyć biggrin.gif W skrócie Router przyjmuje absolutnie wszystkie wartości od strony użytkownika i na ich podstawie wybiera co ma zostać uruchomione.

edit:

Nie mogłem się powstrzymać. Oto Dispatcher:
plurr
Cytat(marcio @ 20.03.2009, 23:04:05 ) *
Myslalem nad kupnem tego: http://helion.pl/ksiazki/probph.htm

Ogolnie czytam i czytam ale widze ze te OOP to czarna magia dla mnie tongue.gif


Czytalem kiedys ta ksiazke, polecam. Chociaz, z tego co pamietam, wzorce i MVC sa dosyc "sucho" wytlumaczone i w dosyc okrojonej formie.

Jesli masz problemy z OOP to powinienes skupic sie najpierw na tym, a wzorce w tym MVC same sie przyturlaja.
erix
Cytat
PHP nie kopiuje obiektow tylko tworzy aliasy, wiec nie jest do konca jasne co tu sie tworzy... powinno byc:

Jak nie jest do końca jasne? Każde przypisanie zmiennej przechowującej obiekt tworzy kolejną referencję, a nie kopię. W PHP4 tworzyło kopię, w PHP5 używa się keywordu clone" title="Zobacz w manualu PHP" target="_manual, aby zduplikować obiekt.

Wszystko jest jasne, tylko trzeba czasem poczytać i manuala, a nie tylko książki. tongue.gif
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.