Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> MVC raz jeszcze.
krzywy36
post
Post #1





Grupa: Zarejestrowani
Postów: 370
Pomógł: 43
Dołączył: 1.12.2007
Skąd: Kędzierzyn Koźle

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


Wiem, że jest masa tematów na forum o tematyce MVC ale chyba w żadnym nie ma zawartych wszystkich zasad/odpowiedzi.
Zabrałem się ostatnio za OOP i chciałem napisać coś większego, przy okazji sprawdzając wiedzę, ale stwierdziłem, że trzeba oprzeć to na jakimś ogólnym wzorcu - jak tworzyć podstrony, struktury katalogów itp. i wtedy zacząłem interesować się MVC, tak więc:

Struktura katalogów:
Kod
|core/
|controllers/
|models/
|views/
|classes/
|web/
|index.php


Po kolei:
W core znajdują się klasy: router, db, controller, model, view itp.
w controllers znajdują się klasy kontrolerów, dziedziczące po klasie controller (abstrakcyjna klasa controller to ogólny zarys kontrolera)
models to samo, czyli dziedziczace po klasie model
views - widoki wybierane w zaleznosci od akcji
classes - inne klasy, narazie nic tam nie ma,
web - skrypty js, style itp.
index.php - dołącza odpowiednie pliki i "zaczyna akcje"

?url = nazwaKontrolera/ akcja/ param1/ param2/ paramN...

Router parsuje url i się zaczynają problemy:
1. sam powinienem tworzyć obiekt kontrolera czy jakaś metoda routera (czy moze jeszcze innej klasy?) powinna to robić?
2. gdzie trzymać obiekt controllera? po prostu w zmiennej, czy moze w obiekcie innej klasy* za to odpowiedzialnej, jeśli to drugie to jak powinna działać ta klasa?
3. zakładając, że mam już utworzony obiekt kontrolera, wywołuje jakaś jego metode (akcja) - teraz jest tworzony obiekt widoku? jeśli tak to gdzie go trzymać, w kontrolerze, czy w obiekcie innej klasy*?
4. chcąc być zgodnym z koncepcją MVC, to widok powinien poprzez model pobierac dane, więc obiekt modelu powinien być tworzony i trzymany w widoku czy może wcześniej w kontrolerze?
5. potem widok wyświetla dane blablabla... hmm, to co tak właściwie robi kontroler? bo idąc moim tokiem myślenia (który jest prawdopodobnie błędny) tylko, tworzy i przechowuje widok?

*inna klasa - rejestr?

Próbowałem coś pisać ale się pogubiłem, więc zwracam się do was o pomoc, móglby ktoś napisać klarowne odpowiedzi na moje pytania? Ewentualnie opisać co konkretnie powinien robić kontroler, model, widok i jakie są zależności pomiędzy nimi (co do czego powinno mieć dostęp, co może modyfikować co itp.)

Wszystkie sugestie/rady/krytyka na temat czegokolwiek co tu napisałem - mile widziane (IMG:style_emoticons/default/snitch.gif)

Ten post edytował krzywy36 4.07.2010, 01:08:07
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





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

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


Powiedzmy, że mamy podstronę na której wyświetlamy użytkowników serwisu w tabelce (kolumny: nazwa, email, wiek, płeć, data rejestracji) oraz dzielimy ją po 50 wpisów na stronę.

Kontroler:
  1. $model = new MembersModel();
  2. $model->setPerPageLimit(50);
  3.  
  4. $view = new TableView($model);
Model:
  1. class MembersModel implements Sortable, Paginable {
  2. // Sortable interface
  3. protected $sortBy = 'name';
  4. protected $sortDir = 'ASC';
  5.  
  6. // Paginable interface
  7. protected $perPageLimit = 10;
  8. protected $currentPage = 1;
  9.  
  10. // Implementacja interfejsow (settery/gettery dla powyższych)
  11.  
  12. public function retrieve() {
  13. // pseudokod
  14. $sql = 'SELECT ... FROM ... ORDER BY $sortBy $sortDir LIMIT {$perPage * $currentPage}, $perPage';
  15. return $sql->fetch();
  16. }
  17. }
Widok
  1. class ... {
  2. if ($model instance of Paginable) {
  3. $model->setCurrentPage($currentPage);
  4.  
  5. // przygotuj listę stron do wyświetlenia itp. itd
  6. // np.:
  7. $totalItems = $model->getTotalItems();
  8. $totalPages = $totalItems / $model->getPerPageLimit()
  9. }
  10.  
  11. if ($model instance of Sortable) {
  12. $model->setSortBy($sortBy);
  13. $model->setSortDir($sortDir);
  14. }
  15. }
  16.  
  17. // i potem w jakimś szablonie
  18.  
  19. foreach($model->getResults() as $item):
  20. // wyswietlanie wiersza
  21. endforoeach;
To nie kontroler odpowiedzialny jest za takie rzeczy jak ustawienie względem czego mają być sortowane wyniki czy która jest obecnie strona - to widok jest za to odpowiedzialny. Widok to nie tylko wyświetlanie danych (w MVP od tego jest ostatnia część - Presenter).
Go to the top of the page
+Quote Post

Posty w temacie


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: 6.10.2025 - 19:58