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%)
-----


@prph korzystajac z Twojej zyczliwosci a przedewszystkim cierpliwosci i dobrych rad postanowilem w koncu cos splodzic. No i wyglada to tak.

Controller
  1. <?php
  2. class Controller {
  3.  
  4. protected $sAction;
  5.  
  6. protected $oRequest;
  7.  
  8. protected $sDefaultAction = 'Index';
  9.  
  10. protected $sView;
  11.  
  12. protected $sDefaultView = 'Index';
  13.  
  14. protected $aVars = array();
  15.  
  16. public function __construct() {
  17. $oRequest = New WebRequest();
  18. }
  19.  
  20. static function & getInstance() {
  21. return $this;
  22. }
  23.  
  24. public function forward($sAction) {
  25. $this->sAction = $sAction;
  26. $this->Perform();
  27. }
  28.  
  29. public function getAction($sAction = null) {
  30. $this->sAction = empty($sAction) ? $this->sDefaultAction : $sAction;
  31. }
  32.  
  33. public function getRequest() {
  34. return $this->oRequest;
  35. }
  36.  
  37. public function getView($sView = null) {
  38. $this->sView = empty($sView) ? $this->sDefaultView : $sView;
  39. }
  40.  
  41. public function setVariable($value, $key = null) {
  42. $this->aVars[$key] = $value;
  43. }
  44. public function Perform() {
  45. $sActionPath = _PATH_ACTION.'actions.'.$this->sAction.'.php';
  46. require_once(_PATH_LIB.'class.Action.php');
  47.  
  48. if (!file_exists($sActionPath)) {
  49.  
  50. $this->forward("ActionDoesntExists");
  51.  
  52. } else {
  53.  
  54. require_once($sActionPath);
  55. }
  56. $oAction = New $this->sAction();
  57. $oAction->Execute();
  58. return;
  59. }
  60.  
  61. public function Display() {
  62. $sTemplatePath = _PATH_TEMPLATE.'views.'.$this->sView.'.php';
  63. require_once(_PATH_LIB.'class.View.php');
  64.  
  65. if (!file_exists($sTemplatePath)) {
  66. $this->forward("ViewDoesntExists");
  67. } else {
  68. require_once($sTemplatePath);
  69. }
  70. $oView = New $this->sView();
  71. $oView->Assign(& $this->aVars);
  72. $oView->Parse();
  73. }
  74.  
  75. }
  76. ?>


Przykladowy widok

  1. <?php
  2. abstract class View {
  3.  
  4. protected $oSmarty;
  5.  
  6. public function __construct() {
  7. $this->oSmarty = New Smarty();
  8. }
  9.  
  10. public function Assign(& $aVars) { 
  11. foreach ($aVars as $key => $value) {
  12. $this->oSmarty->Assign($key, $value);
  13. }
  14. }
  15.  
  16. abstract function Parse() {}
  17. }
  18.  
  19.  
  20. class ActionDoesntExists extends View {
  21.  
  22. public function Parse() {
  23. $oSmarty->setTemplate('path/template');
  24. $oSmarty->Display();
  25. }
  26. }
  27.  
  28. ?>


I akcja

  1. <?php
  2.  
  3. abstract class Action {
  4.  
  5. protected $oController;
  6.  
  7. public function __construct() {
  8. $this->oController = Controller::getInstance();
  9. }
  10.  
  11. abstract function Execute() { }
  12. }
  13.  
  14.  
  15.  
  16. class ActionDoesntExists extends Action {
  17.  
  18. public function Execute() {
  19. $oController->getView(get_class($this));
  20. }
  21. }
  22. ?>


EDIT:
I wywolanie
  1. <?php
  2.  
  3.  
  4. $Application = New Controller();
  5. $Application->getAction($Application->getRequest()->getParam('action', Request::GET));
  6. $Application->Perform();
  7. $Application->Display();
  8.  
  9. ?>

EDIT END

Zaczalem wczoraj tak na dziko troche, fakt faktem tak jak pisales zdaje sobie sprawe z tego ze aplikacja moze sie zapetlic wiec musze dodac jeszcze jakies wyjatki i obsluge tych bledow, no chyba ze zalozenie ze akcja ActionDoesntExists i ViewDoesntExists i odpowiadajace jej widoki sa zawsze (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Ale jak to mowia lepiej dmuchac na zimne (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ogolnie Prph, czy zrealizowalem ogolne zalozenia MVC tym kodem ?

Jesli tak to oczywiscie zdaje sobie sprawe z tego ze to pierwszy framework i w miare budowania na nim aplikacji bede wpadal na nowe i (mam nadzieje) lepsze pomysly. Zalezy mi tylko na jakims komentarzu i stwierdzeniu wprost czy moj start jest zgodny czy nie zgodny z zalozeniami (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

P.S jeszcze nie testowalem, dzisiaj napisze klase Request i Abstrakcje dla DB i jakis model. (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował thornag 25.08.2006, 12:28:58
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: 10.10.2025 - 01:51