Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [OOP][MVC]Wspolpraca Router i Controller
marcio
post 18.03.2009, 23:19:54
Post #1





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

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


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


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
LBO
post 18.03.2009, 23:38:54
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


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
Go to the top of the page
+Quote Post
Orkan
post 19.03.2009, 00:01:43
Post #3





Grupa: Zarejestrowani
Postów: 55
Pomógł: 4
Dołączył: 19.05.2003
Skąd: Gdańsk

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


a tutaj wersja z obrazkami winksmiley.jpg
http://www.symfony-project.org/book/1_2/02...-Symfony-s-Code


--------------------
The fastest app with PHP: <?php die('Hello World'); ?>
Go to the top of the page
+Quote Post
marcio
post 19.03.2009, 00:22:23
Post #4





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

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


Czyli podsumuwyjac bo nie bardzo rozumiem co macie na mysli?


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Orkan
post 19.03.2009, 00:33:49
Post #5





Grupa: Zarejestrowani
Postów: 55
Pomógł: 4
Dołączył: 19.05.2003
Skąd: Gdańsk

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


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


--------------------
The fastest app with PHP: <?php die('Hello World'); ?>
Go to the top of the page
+Quote Post
LBO
post 19.03.2009, 09:41:39
Post #6





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Cytat(marcio @ 19.03.2009, 00:22:23 ) *
Czyli podsumuwyjac bo nie bardzo rozumiem co macie na mysli?


Jakbyś mógł konkretniejsze pytanie zadać.
Go to the top of the page
+Quote Post
marcio
post 19.03.2009, 15:16:47
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(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.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
pejott
post 19.03.2009, 15:40:45
Post #8





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


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. ; >
Go to the top of the page
+Quote Post
marcio
post 19.03.2009, 16:03:42
Post #9





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

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


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.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
pejott
post 19.03.2009, 16:12:17
Post #10





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Hehe, zastanów się co to za różnica ?
Go to the top of the page
+Quote Post
marcio
post 19.03.2009, 16:15:23
Post #11





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

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


Moze i nie ma ale z tego co napisal @Orkan to wlasnie o to mu chodzilo.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
mike
post 19.03.2009, 16:17:33
Post #12





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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.
Go to the top of the page
+Quote Post
pejott
post 19.03.2009, 16:19:31
Post #13





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

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


Ja nie widzę tam nic na temat dziedziczenia.

Zastanów się, czy pralka dziedziczy po krzaku ?
Go to the top of the page
+Quote Post
marcio
post 19.03.2009, 16:27:56
Post #14





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

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


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?


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
LBO
post 19.03.2009, 20:09:21
Post #15





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


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.
Go to the top of the page
+Quote Post
Cysiaczek
post 20.03.2009, 19:31:50
Post #16





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




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


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
marcio
post 20.03.2009, 23:04:05
Post #17





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

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


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.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Orkan
post 21.03.2009, 00:18:14
Post #18





Grupa: Zarejestrowani
Postów: 55
Pomógł: 4
Dołączył: 19.05.2003
Skąd: Gdańsk

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


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. ?>


--------------------
The fastest app with PHP: <?php die('Hello World'); ?>
Go to the top of the page
+Quote Post
LBO
post 21.03.2009, 00:56:25
Post #19





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


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:


Ten post edytował LBO 21.03.2009, 01:04:59
Go to the top of the page
+Quote Post
plurr
post 21.03.2009, 08:51:49
Post #20





Grupa: Zarejestrowani
Postów: 175
Pomógł: 12
Dołączył: 28.06.2007
Skąd: Bytom

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


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.


--------------------
Wyobraźnia bez wiedzy może stworzyć rzeczy piękne.
Wiedza bez wyobraźni najwyżej doskonałe.

Albert Einstein
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 22.06.2025 - 14:58