Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MVC] Moj poczatek / implementacja
Helios
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.07.2006

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


Witam
Od niedawna zaczalem interesowac sie MVC. Ale w dalszym ciagu nie wiem czy dobrze rozumuje istote MVC. Dlatego postanowilem napisac prosty (powtarzam, prosty, system) zeby sprawdzic czy ide w dobrym kierunku. Prosze o komentarze, jesli chodzi o sam schemat i istote wzorca MVC.

Na poczatek przedstawie strukture katalogow:

./ - katalog glowny
actions/ - katalog przechowujacy pliki .ini do wybranej akcji mozemy podac co ma zostac wykonane nastepnie
configs/ - katalog z plikami konfiguracyjnymi - narazie nie uzyty
controllers/ - katalog z kontrolerami - narazie tylko kontroler glowny
models/ - katalog z plikami modeli
views/ - katalog z plikami widokow
index.php - plik glowny ktory uruchamia kontroler

Zaczynamy od poczatku - kod kontrolera:
  1. <?php
  2.  
  3. class Ctrl{
  4.  
  5. private $Request=false; // obiekt
  6. private $action; // nazwa akcji - nieobowiazkowa
  7. private $view; // nazwa widoku
  8. protected $model; // nazwa modelu - nieobowiazkowa
  9.  
  10. protected $objView; // obiekt widoku
  11. protected $objModel; // obiekt modelu
  12.  
  13. // konstruktor
  14. public function __construct($request){ 
  15.  
  16. // ustawianie pol klasy
  17. $this->view=$request->getParam('view');
  18. $this->view=($this->view) ? $this->view : 'main'; // ustawianie standardowego widoku
  19. // jesli zostal podany model ustawia jesli nie jest taki sam jak nazwa widoku
  20. $this->model=($request->getParam('model')) ? $request->getParam('model') : $this->view;
  21. // model z sufixem Mod
  22. $this->model.='Mod';
  23. // pobiera parametr akcji o ile zostal podany
  24. $this->action=$request->getParam('action');
  25.  
  26. // jesli zostala podana akcja laduje model i wykonuje odpowiednia czynnosc
  27. if($this->action){
  28. require_once('./models/'.$this->model.'.model.php');
  29. $this->objModel=new $this->model($request);
  30. $action=$this->action;
  31. $this->objModel->$action();
  32. do{
  33. // sprawdza czy plik konfiguracyjny akcji uwzglednia wykonanie kolejnej akcji
  34. $tmpCfg=parse_ini_file('./actions/'.$this->action.'.ini');
  35. $action=$tmpCfg['next'];
  36. // jesli tak to ja wykonuje itd.
  37. $this->objModel->$action();
  38. }while(!$tmpCfg['next']);
  39. }
  40. // laduje obiekt widoku
  41. $this->execute();
  42. }
  43.  
  44. public function execute($view=false){
  45. // sprawdza czy obiekt modelu juz istnieje czyli czy podana byla akcja
  46. if(!is_object($this->objModel)){
  47. require_once('./models/'.$this->model.'.model.php');
  48. $this->objModel=new $this->model($request);
  49. }
  50. // laduje obiekt widoku
  51. require_once('./views/'.$this->view.'.view.php');
  52. $this->objView=new $this->view($this->objModel);
  53. }
  54.  
  55. }
  56.  
  57. ?>

Zakladamy, ze uzytkownik wpisal: index.php?view=Users&action=addUser&userName=root
kontroler laduje wiec model UsersMod:
  1. <?php
  2.  
  3. class UsersMod {
  4.  
  5. public $addedUser;
  6. public $request;
  7. public $count;
  8.  
  9. function __construct($request){
  10. $this->request=$request;
  11. }
  12.  
  13. function addUser(){
  14. $this->addedUser=$this->request->getParam('userName');
  15. return true;
  16. }
  17.  
  18. function countUsers(){
  19. return $this->count++;
  20. }
  21.  
  22. function getAddedUser(){
  23. return $this->addedUser;
  24. }
  25.  
  26. function getUsersNum(){
  27. return $this->count;
  28. }
  29.  
  30. }
  31.  
  32. ?>

i wykonuje w nim akcje zmianu danych, a poniewaz akcja addUser() posiada plik konfiguracjny z wywolaniem jako kolejnej akcji countUsers wywoluje kolejna akcje. No i pozostaje wyswietlenie widoku Users:
  1. <?php
  2.  
  3. class Users {
  4.  
  5. function __construct($objModel){
  6. print 'Dodalem uzytkownika: '.$objModel->getAddedUser().' i teraz mam zarejestrowanych uzytkownikow: '.$objModel->getUsersNum();
  7. }
  8.  
  9. }
  10.  
  11. ?>


Co sadzicie o tym? Czy dobrze rozumuje istote MVC? Zapraszam do dyskusji...
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thornag
post
Post #2





Grupa: Zarejestrowani
Postów: 504
Pomógł: 2
Dołączył: 31.03.2006
Skąd: Londyn

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


Tak to wszystko miele i mam jeszcze kilka kolejnych pytan. Realizacja rejestrowania uzytkownika w frameworku opartym o wzorzec MVC. Kompletnie nie wiem z ktorej strony to ugryzc.

Dla przykladu. Zostaje wywolany URL http://www.domena.pl/view=RegistrationForm

Kontroller laduje widok RegistrationForm, jako ze nie ma modelu ,kontroller laduje defaultowy model np index. W modelu index metoda np Perform jest pusta (musi zostac zaimplementowana gdyz chcialbym zeby model dziedziczyl po abstrakcyjnej klasie model).

Kontroller laduje model, wywoluje pusta metode Perform modelu - nic sie nie zmienia.
Kontroller wywoluje metode Display() - zostaje wyswietlony formularz rejestracyjny.

Uzytkownik wypelnia formularz i klika w wyslij (walidacja po stronie przegladarki juz byla). I tutaj zaczynaja sie moje problemy.

Jak to wyglada dalej ? Mam sobie obiekt Request i w nim moge przeprowadzic walidacje po stronie serwera.

Ale jak to polaczyc dalej ?

Akcja formularz powiedzmy wyglada tak. http://www.domena.pl/model=User&action=AddNewUser

Kontroller laduje model User, i chce uruchomic akcje AddNewUser, i co dalej ?Ciagle potrzebuje walidacji bo nie wiem gdzie ja tutaj wcisnac, potrzebuje akcje w stylu User->setUsername($username), User->setAddress($address) itp, kiedy przelece przez wszystkie setCostam (powiedzmy ze walidacje ustawie w tych metodach), teraz musze wywolac Model->SaveUser() co powoduje zapisanie ustawionych pol do bazy danych. I teraz znow nie wiem co dalej, w tej akcji ustawic kolejna ktora ustawi widok na np RegistrationDone ?

Same tutaj problemy, powiedzmy ze poczawszy od metody setUsername zawiera ona instrukcje zeby kolejna wywolac setEmail() ta znowu setAddress() itp. Ale co jesli bede chcial wykonac zwykla operacje zmiany Addressu, ktora normalnie wygladala by tak.

  1. <?php
  2. $user = New User($id) // nastepuje ladowanie danych do wlasciwosci.
  3. $user->setAddress($newAddress);
  4. $user->Save();
  5. ?>


Jak sterowac takim dzialaniem za pomoca URL ? Gdzie tu wszedzie jest klasa Request ktora w gruncie rzeczy powstala u mnie po to zeby zajmowac sie calym I/O walidacja eskejpowaniem cytowaniem itp.

Ogolnie jak mowie naczytalem sie sporo ale nie potrafie tego do kupy poskladac.

Ten przyklad obslugi uzytkownika nurtuje mnie najbardziej, stad tez mam prosbe.

Biorac pod uwage nastepujacy StoryBoard :

Kod
1. Uzytkownik wchodzi na strone. Klika w "zarejestruj sie". Wypelnia formularz. Formularz nie zawiera bledow, uzytkownik widzi podziekowania. Uzytkownik jest na stronie glownej (zalogowany). Klika w profil. Chce zmienic swoj adres.

2. Uzytkownik wchodzi na strone. Klika w "zarejestruj sie". Wypelnia formularz. Formularz zawiera bledy, uzytkownik zostaje przekierowany na strone formularza(nie chodzi tutaj o informowanie co zrobil zle). Wypelnia jeszcze raz


Co do mojej prosby, moglby mi ktos opisac jak takie cos zrealizowac ( nie chodzi mi o to zeby to ktos zaimplementowal (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) ), ogolnie taki Walkthrough na zasadzie:

Uzytkownik jest na stornei glownej mamy URL kontroller robi to tamto. Pozniej jest na stronie ?view=form (czy cos) kontroller robi to i tamto.

Wielkie dzieki za zainteresowanie.

@Prph Raz jeszcze dzieki, w koncu lancuchy staly sie klarowne w teori (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie
- Helios   [MVC] Moj poczatek / implementacja   8.07.2006, 14:42:03
- - hwao   Jeżeli to działą, to jest dobre... Nie ma "sz...   8.07.2006, 20:31:55
- - Cysiaczek   Cóż. To zależy, czy widok ma wyciągac dane, czy ap...   8.07.2006, 21:58:18
- - ActivePlayer   @hwao co widok robi u CIebie ?   8.07.2006, 22:34:54
- - hwao   Cytat(Cysiaczek @ 8.07.2006, 22:58 ) Có...   8.07.2006, 22:49:49
- - ActivePlayer   u mnie element widok to 'class view extends sm...   8.07.2006, 22:58:19
- - Cysiaczek   Cytat(hwao @ 8.07.2006, 21:49 ) Umnie g...   8.07.2006, 23:03:10
- - Ociu   Jak na pierwsze starcie nie jest najgorzej. Jak pi...   9.07.2006, 08:19:52
- - Prph   Witam, Ostatnio napisalem (mam nadzieje) framewor...   9.07.2006, 09:54:01
- - .rh-   Witam Odgrzebuje temat, podpisuje się pod nim. Ró...   28.07.2006, 19:39:26
- - Ociu   W mvc chodzi o to, aby moduły/akcje były podzielon...   29.07.2006, 08:36:37
- - Prph   Ociu dobrze mowi Pamietaj, ze MVC to nie framewo...   29.07.2006, 10:02:16
- - .rh-   Zgadza sie, pytam, gdyz czytajac wiele artykulow ...   30.07.2006, 00:09:38
- - thornag   Cytat(Helios @ 8.07.2006, 14:42 ) i wykon...   22.08.2006, 18:53:50
- - Prph   Witam, Akcja: dobrze rozumiesz czym jest. Akcja t...   23.08.2006, 15:08:22
- - thornag   Tak to wszystko miele i mam jeszcze kilka kolejnyc...   23.08.2006, 20:57:30
- - Prph   Witam, Nie podoba mi sie u Ciebie organizacja MVC...   23.08.2006, 22:17:50
- - thornag   Hmm, duzo dalo mi to do myslania, tymbardziej ze p...   23.08.2006, 22:39:14
- - Ociu   Każdy sposób jest dobry, jeśli Ty uwa...   24.08.2006, 07:51:55
- - thornag   @Ociu No tak. Ale inni programisci mogliby stwierd...   24.08.2006, 09:35:02
- - Prph   Jak interpretowac termin kontroler, to zalezy jak ...   24.08.2006, 21:37:40
- - bim2   Przeczytałem temat i teraz ja zadam pare pytań . T...   25.08.2006, 09:07:34
- - thornag   @prph korzystajac z Twojej zyczliwosci a przedewsz...   25.08.2006, 09:26:01
- - bim2   Thormag, powiem ci że nakierowałes mnie Kod mi si...   25.08.2006, 10:02:18
- - thornag   Z tego co zrozumialem model nie ustawia widoku. Mo...   25.08.2006, 11:13:33
- - Ludvik   Trochę zbyt sztywno trzymacie się powiązania model...   25.08.2006, 11:41:22
- - bim2   Mhh, dobra to może teraz cos takieog pokaże. Fajni...   25.08.2006, 12:44:23
- - thornag   @Ludvik Czyli reasumujac i po ludzku mozna by powi...   25.08.2006, 12:44:41
- - Ludvik   Żeby rozwiać wątpliwości - blueprints mvc. Sam w d...   25.08.2006, 13:08:17
- - bim2   @thornag: Masz racje. Każdy robi MVC tak jak chce ...   25.08.2006, 13:25:39


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: 14.10.2025 - 18:58