Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ładowanie modelu dla kontrolera tylko wypadku użycia
Forum PHP.pl > Forum > PHP > Object-oriented programming
freeon
Zastanawiam się jak rozwiązać problem automatycznego ładowania modelu dla kontrolera tylko wtedy gdy bedzie choc raz użyty. Wolalbym tu uniknac wzorca fabryki bo nie chcialbm miec cos takiego
  1. $this->user=user::new();
chcialbym zeby $user byla to klasa ktora po dostepie do niej np. (
  1. $this->user->name=''
) zaladowala model user i podmienila siebie... nie wiem czy sie jasno wyrazilem ale jestem po nie przespanej nocy smile.gif
marcio
Hmmm czekaj jesli dobrze rozumiem importuj plik modelu za pomoca jakiesj klasy ktora bedzie implementowala ta funkcjonalnosc w __get().

Chyba ze zle zinterpretowalem twoje pytanie.
freeon
Dobrze zrozumialeś tylko zastanawiam sie czy mozna to jakos ominanc calkowicie podmienic klasy tylko w przypadku uzycia tu nie chodzi tylko o metode __get modele sa bardziej rozbudowane jesli nie wykombinuje nic bede musial wszystkie magiczne metody tak przechwycic
marcio
Jak dobrze pokombinujesz z __get() i ewentualnie __call() uzyskasz to co chcesz.
U mnie jak chce odwolac sie do jakiegos obiektu i plik jest w jakims tam katalogu i nie zostal includowany robie tak jak ty to opisales:
  1. $this -> klasa -> metoda(); //etc.....

Wtedy moj Fw przeszukuje katalogi az do napotkania pliku klasa.php gdy go napotka includuje go i tworzy obiekt klasa i zwraca mi go.
cojack
A ja sobie wczytuję ręcznie modele do kontrolera, imo mniej zabawy.
freeon
No tak niby mniej zabawy ale potem fajnie by bylo gdyby model byl ladowany automatycznie wtedy gdy jest potrzebny zaoszczedzilbym jedna linijke przy kazdym kontrolerze smile.gif
cojack
A co jeżeli jest już załadowany? ;] Musiałbyś go rejestrować w jakimś singletonie a później sprawdzać czy jest zarejestrowany, to jest grzebanie w tablicach, dodatkowo opóźnia wykonanie kodu, a tak wczytujesz i się nie przejmujesz.
Crozin
Cytat
edna linijke przy kazdym kontrolerze
Chyba raczej tyle linijek ile modeli używasz w danym kontrolerze.
IMO lepiej jest jednak to ręcznie robić - lepsza czytelność, mniej kombinowania, a potencjalny zysk w postaci dwóch, trzech linijek kodu jest niewielki.

Ja generalnie w przypadku obiektów modeli w ogóle nie wykorzystuję pól obiektu kontrolera - wolę to mieć w zmiennej lokalnej i ew. przekazać przez referencję, jeżeli potrzebuję go w innej metodzie.
  1. public function ...(){
  2. $abc = new Abc();
  3. $def = Def::getSth('dsd');
  4.  
  5. //i w abc, def masz dostęp do dwóch modeli
  6. }
Jakoś nie specjalnie dużo kombinowania, a kod jest dużo czytelniejszy.
marcio
Cytat(cojack @ 3.10.2009, 15:02:29 ) *
A co jeżeli jest już załadowany? ;] Musiałbyś go rejestrować w jakimś singletonie a później sprawdzać czy jest zarejestrowany, to jest grzebanie w tablicach, dodatkowo opóźnia wykonanie kodu, a tak wczytujesz i się nie przejmujesz.

Jak cos to bardziej pasowalby Register a nie singleton wedlug mnie.

A dwa to sa ulamki ulamkow mili-sekund......
cojack
marcio a kto broni używać registera w singletonie? ;]

w Doctrine jest zrobione tak że wszystkie modele są wczytywane od razu, przy załadowaniu strony, też ciekawe.
witul
hmmm
jest juz troche pozno i moge nie zalapac ocb w temacie biggrin.gif
ale z tego co rozumiem to problem tkwi w odpowiedniej implementacji autoloadera snitch.gif
o autoloaderach sa rozne ciekawe tematy, poszukaj

ja mam autoloader tak rozwiazany (+ mapki na zasadzie "nazwa_klasy"=>"sciezka_do_pliku"):

  1. class Autoloader{
  2. private static $map=array();
  3. private static $included=array();
  4. public function __construct(){
  5. $this->loadMaps();
  6. }
  7. private function loadMaps(){
  8. $components_dir=array();
  9. $current_mod_components_dir=APPPATH.'components/';
  10. foreach(new DirectoryIterator($current_mod_components_dir ) as $v){
  11. if(!$v->isDot() && $v->isDir())
  12. $components_dir[]=$v->getPathname().'/config/maps';
  13. }
  14. $maps_dirs=array(
  15. SYSPATH.'config/maps/',
  16. APPPATH.'config/maps/');
  17. $maps_dirs=array_merge($maps_dirs,$components_dir);
  18. foreach($maps_dirs as $map_dir){
  19. foreach(new DirectoryIterator($map_dir) as $map){
  20. if(!$map->isDot() && !$map->isDir()){
  21. include $map->getPathname();
  22. self::$map=array_merge($map,self::$map);
  23. }
  24. }
  25. }
  26. self::$map=array_unique(self::$map);
  27. }
  28. public function load($class_name){
  29. if(!in_array($class_name,self::$included) && isset(self::$map[$class_name])){
  30. include self::$map[$class_name];
  31. self::$included[]=$class_name;
  32. return self::$map[$class_name];
  33. }
  34. else return false;
  35. }
  36. }



Do tego cache'owanie map plikow i nie martwimy sie o zadne ladowania plikow

Pozdrawiam
freeon
Tylko chodzi o to że auto loader klas jest tu zastowany... kontroler jest zawsze zaladowany a chodzi oto zeby model byl ladowany w ten sposob ze byla by to jakas mala klasa ktora po pierwszym dostepnie do niej podmienila by siebie na wlasciwa a jesli model nie byl by uzyty to nie robila by nic. Narazie mam zrobioen to w ten sposob ze mam przechwytywane magiczne metody typu _call itp.. ale to nie jest wygodny sposob gdyz np. model dostaje zmienne w tablicy a nie typu $var1,$var2...... Chyba jednak zrobie tak ze za kazda raza do kontrolera musi byc ladowany model..
marcio
Cytat
model dostaje zmienne w tablicy a nie typu $var1,$var2......

Teraz nie pamietam gdzie ale chyba w kohanej widzialem takie rozwiazanie ze mieli funkcje w niej switch i na zasadzie ile dana funkcja miala argumentow byl foreach() na tablice i potem elementy byly wkladane do funkcji, nie wiem czy mnie zrozumiales, jak znajde ten plik to ci podam.
freeon
Ciekawe rozwiązanie nie wpadlem na to..... po południu zaraz to przetestuje powinno dzialac.... ale dalej mnie zastanawia fakt czy nie mozna tego jakos ominąć aktywowanie modeli
marcio
  1.  
  2. $args = func_num_args();
  3. $argv[] = func_get_args();
  4.  
  5.  
  6. switch($args) {
  7.  
  8.   case 0:
  9.            jakas_funkcja();
  10.            break;
  11.  
  12.   case 1:
  13.            jakas_funkcja($argv[0]);
  14.            break;
  15.  
  16.   case 2:
  17.            jakas_funkcja($argv[1], $argv[2]);
  18.            break;
  19.  
  20. }
  21.  


Itp zalezy ile dana funckja ma miec parametrow cos takie to taki wzor powinien dzialac.
cojack
marcio, co Ty q... za herezje wypisujesz? Pobierasz argumenty funkcji bez funkcji O_o I ten func_num_args, to imo zbyteczność, func_get_args i cout i święto lasu... ale co Ty tu tworzysz?

@edit

Crozin no szał pał.
Crozin
Taa... call_user_func_array - jest bajer co nie?
marcio
@cojack palancie wiesz co to wzor?




@Crozin niestety znam ta funkcja sam ja uzywam nie tylko ty ja znasz nie przyszla mi niestety do glowy wiec wybacz.




Cytat
Pobierasz argumenty funkcji bez funkcji O_o I ten func_num_args, to imo zbyteczność, func_get_args i cout i święto lasu... ale co Ty tu tworzysz?


Qur** a widzisz w tym jakas roznice, bo ja nie oprocz tego ze ty skorzystasz z innych funkcji.

nospor
Cytat
@cojack palancie wiesz co to wzor?
czy cojak cie wyzwal ze tak mu sie odszczekujesz? Bo ja nie zauwazylem tego.
+10 z moderką
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.