Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MVC - model
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
.dragonfly
Buduje aplikacje oparta o MVC i w zwiazku z tym faktem doszedlem do pewnego rozwiazania. Teraz mam pytanie na ile jest ono trafne.

Jak wszyscy wiemy model ma za zadanie tylko operacje na danych. Czy dobrym rozwiazaniem jest zbudowanie modelu ktory odwoluje sie do "pod-modelow" (modulow) w nastepujacy sposob:


  1. <?php
  2.  
  3. /*
  4.  * W tym fragmencie kodu odwolujemy sie do modelu oraz sub-modulu user
  5.  * ktory operuje rzadaniami zwiazanymi z operacjami na uzytkowniku
  6.  */
  7. $this->model[user]->userProfile(1);
  8.  
  9.  
  10. ?>


Ladowanie modulu (metoda w klasie Model):

  1. <?php
  2.  
  3.  
  4.  
  5.  /**
  6. * Wybiera odpowiedni modul, includujac plik
  7. * @param $strModuleType 
  8. * @param $strModuleName
  9. * @param $strModuleVar
  10. * @return 
  11. */
  12. function loadModule( $strModuleType, $strModuleName, $strModuleVar = false )
  13. {
  14. if ( !$strModuleVar ) $strModuleVar = $strModuleName;
  15. require_once ( ENVIE_DIR . &#092;"modules\" . $strModuleType . \"envie.module.\" . $strModuleName . \"\" . $strModuleName . '.module.php' );
  16. $this->model[$strModuleVar] = new $strModuleName;
  17. } 
  18. ?>


Kazdy sub-modul jest "dzieckiem" (extends) klasy Model. Co sadzicie o takim rozwiazaniu
seaquest
Jest ono calkiem pozyteczne, bo ladujesz klasy np tylko w kernelu, aczkolwiek pociaga za soba pewne konsekwencje. Moim zdaniem ta zmienna powinna byc "prywatna" (jezeli php5) i dostep do niej powinien byc ograniczony przez zdefiniowane metody.
.dragonfly
@seaquest: Dokladnie tak jak powiedziales jest to juz rozwiazane. IMO przy takim rozwiazaniu aplkacja zyskuje nie tylko na przejrzystosci, ale przedewszyskim na wydajnosci.

Rozwiazanie jakie zaproponowalem jest moim zdaniem przydatne przy rozbudowanych aplikacjach i daje ciekawe mozliwosci rozbudowy.
hwao
Uwaga czytanie ponizszego posta jest na wlasne ryzyko oglupienie spowodowane jego zawartosci merytoryczna(doslowna jak i ukryta) nie ponosze odpowiedzialnosc ;-) czytasz to na wlasna reke smile.gif

A wiec... umnie ladowanie wyglada tak
  1. <?php
  2. //...,
  3. private function LoadModule( $strModule )
  4. {
  5.  //
  6.  $strModule = strtolower( $strModule );
  7.  
  8.  if( file_exists( DIR . 'core' . $strModule .'.class.php' ) )
  9.  {
  10. include( DIR . 'core' . $strModule .'.class.php' );
  11.  
  12. if( class_exists( $strModule ) )
  13. {
  14.  Core::get( $strModule, new $strModule );
  15.  return TRUE;
  16. }
  17. else
  18. {
  19.  throw new Exception( 'Core::LoadModule - Nie istnieje klasa ' '. $strModule .' ' .' );
  20.  return FALSE;
  21. }
  22.  }
  23.  else
  24.  {
  25. throw new Exception( 'Core::LoadModule - Plik ' '. $strModule .'.class.php' nie istnieje.' );
  26. return FALSE;
  27.  }
  28.  
  29. }
  30. //...
  31. ?>

Ale to moduly core... co do modolow typu menu news itp. bedzie do tego dodatkowa klasa ktora bedzie je odpowiednio ladowac tzn.
Wpierw sa pobierane dane z bazy danych nastepnie sa interpretowane, poczym zostaja zalaczone i tam odpowiednia czesc kodu nimi steruje, wysylaja dane i takowe o ile sa sa wysylane posrednio do widoku ktory je interpretuje...

Co do dziedziczenia w modelu nie wiem czy to napewno trafne. Osobiscie wolal bym obiekt wrzucic do protected i tam na nim operowac (w zaleznosc od tego co che uzywskac laduje sie odpowiednia klasa).

Ogulnie to malo co zrozumialem z pytania wiac odpowiedz tez moze byc malo zrozumiala i nie trafna
.dragonfly
Jedynym niedopatrzeniem z mojej strony mogl byc byc fakt iz nie pokusilem sie o sprawdzanie czy dana klasa oraz plik istnieja, ale to w rozwazaniu na temat metody sprawa kosmetyczna.

  1. <?php
  2.  
  3. /**
  4. * Wybiera odpowiedni modul, includujac plik
  5. *
  6. * @param $strModuleType
  7. * @param $strModuleName
  8. * @param $strModuleVar
  9. * @return
  10. */
  11. function loadModule( $strModuleType, $strModuleName, $strModuleVar = false )
  12. {
  13. if ( !$strModuleVar ) $strModuleVar = $strModuleName;
  14.  
  15. if ( file_exists( ENVIE_DIR . &#092;"modules\" . $strModuleType . \"envie.module.\" . $strModuleName . \"\" . $strModuleName . '.module.php' ) )
  16. {
  17. require_once ( ENVIE_DIR . &#092;"modules\" . $strModuleType . \"envie.module.\" . $strModuleName . \"\" . $strModuleName . '.module.php' );
  18. if ( class_exists( $strModuleName ) )
  19. {
  20. $this->model[$strModuleVar] = new $strModuleName;
  21. } 
  22. else
  23. { 
  24. // brak klasy
  25. } 
  26. } 
  27. else
  28. { 
  29. // brak pliku
  30. } 
  31. } 
  32. ?>


Dodatkowo w twoim rozwiazaniu nie ma mozliwosci zaladowania modulu pod inna nazwa. Tzn. nie mozesz zaladowac modulu "Foo" i odwolywac sie do niego poprzez np. $this->model[bar]->costam()

Co do dziedziczenia w modelu jest to jak najbardziej wskazane przy takowym rozwiazaniu wiec w tym aspekcie nie moge sie z toba zgodzic. Anyone else?
kwedo
mi obecne dzialanie kodu odpowiada biggrin.gif
bela
sorry za OT: ale czemu macie takie same avatary ? trudno was rozronic dry.gif
.dragonfly
Dlatego ze nalezymy do tej samej agencji (nie towarzyskiej winksmiley.jpg )
Reszte tego typu pytan wysylaj raczej na PW. Odpowiedzialem tutaj zeby juz nikt nie spamowal na ten temat.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.