Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MVC] Ładowanie modelu
PiotrekM
post
Post #1





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


Witam,
piszę mały silnik dla swojej aplikacji. Chcę go oprzeć o wzorzec MVC. Chciałbym zrobić ładowanie modelu podobnie jak w kohanie, tylko jest jeden problem.
Mam klase loader, metode model.
  1. public function model( $name) {
  2.  
  3. //require
  4. require MODELS_PATH . $name . '.php';
  5. $this -> $name = new $name;
  6. }

gdy w kontrolerze dziedzicze klase loader, to przy tworzeniu modelu pole tworzy się w klasie loader, więc z kontrolera nie mam bezpośredniego dostępu $this -> pole.
Jak można by to inaczej zrobić? Jestem otwarty na propozycje (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Jeśli dobrze zrozumiałem, to chcesz wywołać metodę klasy bazowej w klasie wyprowadzonej, rozwiązanie jest proste: parent
Go to the top of the page
+Quote Post
PiotrekM
post
Post #3





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


sory, troche w błąd wprowadziłem. nie chce dziedziczyć klasy, tylko w kontrolerze ją wywołać $this -> load = new loader;
i potem ładowac modele $this -> load -> model('model'); i chce by mi pole modelu tworzyło w kontrolerze, a nie w loaderze
Go to the top of the page
+Quote Post
darko
post
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Magiczne setter i getter powinny wystarczyć.
ps. nie wiem, jak to dokładnie wygląda w Kohanie.
Go to the top of the page
+Quote Post
PiotrekM
post
Post #5





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


nie wiem jak to można zastosować, szczerze mówiąc pierwszy raz sie z takim czymś spotykam. Jakaś mała podpowiedź?
Go to the top of the page
+Quote Post
darko
post
Post #6





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


http://www.php.net/manual/en/language.oop5...loading.members
Pokaż jeszcze swój kod, bo nie mam pewności czy rozmawiamy o tym samym.

Ten post edytował darko 20.02.2010, 23:26:10
Go to the top of the page
+Quote Post
PiotrekM
post
Post #7





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


nie rozumiem jak chcesz to niby zastosować?
Go to the top of the page
+Quote Post
darko
post
Post #8





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Cytat(PiotrekM @ 20.02.2010, 23:27:36 ) *
nie rozumiem jak chcesz to niby zastosować?

Właśnie dlatego prosiłem o pokazanie kodu, bo nie mam pewności czy się rozumiemy. Zastosowanie magicznego settera w kontrolerze można byłoby połączyć z tablicą przechowującą modele, wystarczyłoby zwracać instancę tworzonego modelu w metodzie load klasy loader (jeśli Cię dobrze zrozumiałem). Zresztą zerknij jeszcze tu
Go to the top of the page
+Quote Post
PiotrekM
post
Post #9





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


  1. <?php
  2. //loader on controller
  3. class loader {
  4.  
  5. /**
  6. * method view
  7. *
  8. */
  9.  
  10. public function view( $file, $array = true) {
  11.  
  12.  
  13. //if second argument is array
  14. if( is_array( $array)) {
  15.  
  16. foreach( $array as $item => $val) {
  17.  
  18. //this is vars
  19. $$item = $val;
  20. }
  21. }
  22.  
  23. //display view
  24. include VIEWS_PATH . $file . '.php';
  25. }
  26.  
  27. /**
  28. * method model
  29. *
  30. */
  31.  
  32. public function model( $name) {
  33.  
  34. //require
  35. require MODELS_PATH . $name . '.php';
  36. $this -> $name = new $name;
  37. }
  38. }
  39.  
  40. class controller {
  41.  
  42. public function __construct() {
  43.  
  44. $this -> load = new loader;
  45.  
  46. $this -> load -> model('test');
  47.  
  48. echo $this -> test -> oki();
  49. }
  50. }


Ten post edytował PiotrekM 21.02.2010, 00:03:10
Go to the top of the page
+Quote Post
darko
post
Post #10





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


  1. class test {
  2. public $test = 'test';
  3. public function Test() {
  4. return 'test method';
  5. }
  6. }
  7. /////////////
  8. //loader on controller
  9. class loader {
  10.  
  11. /**
  12. * method view
  13. *
  14. */
  15.  
  16. public function view( $file, $array = true) {
  17.  
  18.  
  19. //if second argument is array
  20. if( is_array( $array)) {
  21.  
  22. foreach( $array as $item => $val) {
  23.  
  24. //this is vars
  25. $$item = $val;
  26. }
  27. }
  28.  
  29. //display view
  30. include VIEWS_PATH . $file . '.php';
  31. }
  32.  
  33. /**
  34. * method model
  35. *
  36. */
  37.  
  38. public function model( $name) {
  39.  
  40. //require
  41. require MODELS_PATH . '.' . $name . '.php';
  42. //$this -> $name = new $name;
  43. return new $name;
  44. }
  45. }
  46.  
  47. class controller {
  48.  
  49. private $_models = array();
  50. protected $load = null;
  51.  
  52. public function __construct() {
  53.  
  54. $this -> load = new loader;
  55.  
  56. $this ->_models[] = $this->load -> model('test');
  57.  
  58. echo $this ->_models[0] ->Test();
  59. }
  60. }
  61.  
  62. $c = new controller();


Ten post edytował darko 21.02.2010, 00:28:37
Go to the top of the page
+Quote Post
PiotrekM
post
Post #11





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


nie działa:

Notice: Undefined property: controller::$test in C:\xampp\htdocs\tomato\system\libraries\controller.php on line 68

Fatal error: Call to a member function oki() on a non-object in C:\xampp\htdocs\tomato\system\libraries\controller.php on line 59

Kod
napisz metodę do przechowywania modeli wewnątrz kontrolera, po co się tak męczyć, albo lepiej: $this->_models[] = $this -> load -> model('test');

nie ma jak.
napisze w konstruktorze, to zanim dodam model to mi już tablice spróbuje zapełni.
dam w destruktorze, to już mi będą dane zbędne :/
Go to the top of the page
+Quote Post
darko
post
Post #12





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Zedytowałem swojego poprzedniego posta zmieniając w ogóle koncepcję.
Go to the top of the page
+Quote Post
PiotrekM
post
Post #13





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


działa, ale nie tak jak powinno. Chciałem przy ładowaniu modelu stworzyć też pole dla niego :/
Go to the top of the page
+Quote Post
darko
post
Post #14





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Cytat(PiotrekM @ 21.02.2010, 00:33:30 ) *
działa, ale nie tak jak powinno. Chciałem przy ładowaniu modelu stworzyć też pole dla niego :/

Cieszę się, że udało się dobrnąć do tego stwierdzenia (IMG:style_emoticons/default/smile.gif) W tym momencie należałoby zaimplementować proponowane przeze mnie magiczne metody: setter i getter, np.
  1. class controller {
  2.  
  3. private $_models = array();
  4. protected $load = null;
  5.  
  6. public function __construct() {
  7.  
  8. $this -> load = new loader;
  9.  
  10. $this ->_models['test'] = $this->load -> model('test');
  11.  
  12. echo $this ->_models['test'] ->Test();
  13. }
  14.  
  15. public function __set($prop_name,$prop_value) {
  16. $this->$prop_name = $prop_value;
  17. }
  18.  
  19. public function __get($model_name) {
  20. return $this->_models[$model_name];
  21. }
  22. }
  23.  
  24. $c = new controller();
  25. print_r($c->test);
  26. echo $c->test->Test();


Ten post edytował darko 21.02.2010, 00:41:41
Go to the top of the page
+Quote Post
PiotrekM
post
Post #15





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


sęk w tym, że chce się do tego zwracać w konstruktorze w klasie, a nie poza nią.
echo $this -> test -> oki(); nie działa
Go to the top of the page
+Quote Post
darko
post
Post #16





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Myślałem, że już się sam domyślisz o co chodzi:

  1. class test {
  2. public $test = 'test';
  3. public function Test() {
  4. return 'test method';
  5. }
  6. }
  7.  
  8. class controller {
  9.  
  10. private $_models = array();
  11. protected $load = null;
  12.  
  13. public function __construct() {
  14.  
  15. $this -> load = new loader;
  16.  
  17. $this ->_models['test'] = $this->load -> model('test');
  18.  
  19. //echo $this ->_models['test'] ->Test();
  20. // Proszę bardzo, magiczny getter zadziałał:
  21. echo $this->test->Test();
  22. }
  23.  
  24. public function getModels() {
  25. return $this->_models;
  26. }
  27.  
  28. public function __set($prop_name,$prop_value) {
  29. $this->$prop_name = $prop_value;
  30. }
  31.  
  32. public function __get($model_name) {
  33. return $this->_models[$model_name];
  34. }
  35. }
  36.  
  37. $c = new controller();


Ten post edytował darko 21.02.2010, 00:46:48
Go to the top of the page
+Quote Post
PiotrekM
post
Post #17





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


Dzięki staruszku, w nocy się nie domyślam niczego także wybacz. Pewnie, ze działa.
Go to the top of the page
+Quote Post
darko
post
Post #18





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Cytat(PiotrekM @ 21.02.2010, 00:50:57 ) *
Dzięki staruszku, w nocy się nie domyślam niczego także wybacz. Pewnie, ze działa.

Staruszku? No dzięki (IMG:style_emoticons/default/winksmiley.jpg)
W ogóle proponuję coś takiego:

  1. class test {
  2. public $test = 'test';
  3. public function Test() {
  4. return 'test method';
  5. }
  6. }
  7. class test2 {
  8. public $test = 'test2';
  9. public function Test2() {
  10. return 'test method2';
  11. }
  12. }
  13. /////////////
  14. //loader on controller
  15. class loader {
  16.  
  17. /**
  18. * method view
  19. *
  20. */
  21.  
  22. public function view( $file, $array = true) {
  23.  
  24.  
  25. //if second argument is array
  26. if( is_array( $array)) {
  27.  
  28. foreach( $array as $item => $val) {
  29.  
  30. //this is vars
  31. $$item = $val;
  32. }
  33. }
  34.  
  35. //display view
  36. include VIEWS_PATH . $file . '.php';
  37. }
  38.  
  39. /**
  40. * method model
  41. *
  42. */
  43.  
  44. public function model( $name) {
  45.  
  46. //require
  47. require MODELS_PATH . '.' . $name . '.php';
  48. //$this -> $name = new $name;
  49. return new $name;
  50. }
  51. }
  52.  
  53. class controller {
  54.  
  55. private $_models = array();
  56. protected $load = null;
  57.  
  58. public function __construct() {
  59.  
  60. $this -> load = new loader;
  61. $this->_loadModels(array('test','test2'));
  62. echo $this->test->Test();
  63. echo $this->test2->Test2();
  64. }
  65.  
  66. public function __set($prop_name, $prop_value) {
  67. $this->_models[$prop_name] = $prop_value;
  68. //$prop_name = $prop_value;
  69. }
  70.  
  71. public function __get($model_name) {
  72. return $this->_models[$model_name];
  73. }
  74.  
  75. private function _loadModels(array $models) {
  76. foreach($models as $m) {
  77. $this->_models[$m] = $this->load->model($m);
  78. }
  79. }
  80. }
  81.  
  82. $c = new controller();
Go to the top of the page
+Quote Post
PiotrekM
post
Post #19





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


czekaj, czekaj, bo o jednej rzeczy zapomnieliśmy (IMG:style_emoticons/default/biggrin.gif)
  1. $this ->_models['test'] = $this->load -> model('test');

jak zrobić, bym nie musiał dawać tego $this ->_models['test'].
bo jak chce operować na metodach klasy, to mode dać load model i niech mi tworzy pole w klasie, co nie? :]
Go to the top of the page
+Quote Post
darko
post
Post #20





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


O niczym nie zapomnieliśmy zerknij na metodę _loadModels oraz konstruktor (IMG:style_emoticons/default/winksmiley.jpg) Tylko tak dla porządku to powinno to zostać przerzucone do samego loadera dla utrzymania jakichś podstaw logiki, no ale to już sobie poradzisz i posprzątasz w tych klasach. A tak już zupełnie profesjonalnie to powinien być dobrze napisany autoloader z jakimiś przejrzystymi regułami, który umożliwiałby lazy loading modeli.

Ten post edytował darko 21.02.2010, 01:06:55
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 21.12.2025 - 00:22