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:
<?php class Ctrl{ private $Request=false; // obiekt private $action; // nazwa akcji - nieobowiazkowa private $view; // nazwa widoku protected $model; // nazwa modelu - nieobowiazkowa protected $objView; // obiekt widoku protected $objModel; // obiekt modelu // konstruktor public function __construct($request){ // ustawianie pol klasy $this->view=$request->getParam('view'); $this->view=($this->view) ? $this->view : 'main'; // ustawianie standardowego widoku // jesli zostal podany model ustawia jesli nie jest taki sam jak nazwa widoku $this->model=($request->getParam('model')) ? $request->getParam('model') : $this->view; // model z sufixem Mod $this->model.='Mod'; // pobiera parametr akcji o ile zostal podany $this->action=$request->getParam('action'); // jesli zostala podana akcja laduje model i wykonuje odpowiednia czynnosc if($this->action){ require_once('./models/'.$this->model.'.model.php'); $this->objModel=new $this->model($request); $action=$this->action; $this->objModel->$action(); do{ // sprawdza czy plik konfiguracyjny akcji uwzglednia wykonanie kolejnej akcji $action=$tmpCfg['next']; // jesli tak to ja wykonuje itd. $this->objModel->$action(); }while(!$tmpCfg['next']); } // laduje obiekt widoku $this->execute(); } public function execute($view=false){ // sprawdza czy obiekt modelu juz istnieje czyli czy podana byla akcja require_once('./models/'.$this->model.'.model.php'); $this->objModel=new $this->model($request); } // laduje obiekt widoku require_once('./views/'.$this->view.'.view.php'); $this->objView=new $this->view($this->objModel); } } ?>
Zakladamy, ze uzytkownik wpisal: index.php?view=Users&action=addUser&userName=root
kontroler laduje wiec model UsersMod:
<?php class UsersMod { public $addedUser; public $request; public $count; function __construct($request){ $this->request=$request; } function addUser(){ $this->addedUser=$this->request->getParam('userName'); return true; } function countUsers(){ return $this->count++; } function getAddedUser(){ return $this->addedUser; } function getUsersNum(){ return $this->count; } } ?>
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:
<?php class Users { function __construct($objModel){ print 'Dodalem uzytkownika: '.$objModel->getAddedUser().' i teraz mam zarejestrowanych uzytkownikow: '.$objModel->getUsersNum(); } } ?>
Co sadzicie o tym? Czy dobrze rozumuje istote MVC? Zapraszam do dyskusji...