Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Wywolanie metody/zmiennej z klasy przodka, lub cos w tym stylu....
Wolfie
post 5.10.2009, 11:02:46
Post #1





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Witam,

Mam taki kod MainController.php, prosze zwrocic uwage glownie na ostatnia metode setModel() :

  1. <?php
  2.  
  3. class MainController {
  4.  
  5. private $controllerPrefix;
  6. private $controllerSufix;
  7. private static $instance;
  8.  
  9. private function __construct() {
  10. $this->controllerPrefix = 'controllers/class.';
  11. $this->conntrolerSufix = '.php';
  12. }
  13.  
  14. static public function getInstance() {
  15. if (!self::$instance instanceof self) {
  16. self::$instance = new self;
  17. }
  18. return self::$instance;
  19. }
  20.  
  21. public function dispatch($_POST = null) {
  22.  
  23. $controllerClassName = $_POST['controller'];
  24. //echo $controllerClassName;
  25. if(isset($_POST['action'])) {
  26. $model = ucfirst($_POST['action']);
  27. $this->setModel($model);
  28. }
  29. $params = $_POST;
  30.  
  31. if($_POST['controller'] != '') {
  32. if(file_exists($this->controllerPrefix.$_POST['controller'].$this->controllerSufix)) {
  33. $controllerClass = new $controllerClassName($params);
  34. } else {
  35. $controllerClass = new LoginController($params);
  36. }
  37. } else {
  38. //$this->dispatch_default();
  39. $controllerClass = new LoginController($params);
  40. }
  41. }
  42.  
  43. private function setModel($model) {
  44. $className = $model.'Model';
  45. $this->Model = new $className;
  46. }
  47.  
  48. }


No i teraz robie klase dziedziczacą po MainController :

  1. class LoginController extends MainController{
  2.  
  3. function __construct($params) {
  4. $action = $params['action'];
  5.  
  6. if(method_exists('LoginController', $action)) {
  7. $this->$action($params);
  8. } else {
  9. $this->defaultAction();
  10. }
  11. }
  12.  
  13. function defaultAction() {
  14. echo 'Widok logowania';
  15. $this->view = new LoginView;
  16. $this->view->display('login');
  17. }
  18.  
  19. function mailbox() {
  20. echo 'login';
  21. $_SESSION['login'] = $_POST['login'];
  22. $_SESSION['pass'] = $_POST['pass'];
  23. if(($this->Model->connect('gmail.com',$_SESSION['login'],$_SESSION['pass'],'993','imap')) == false) {
  24. //$this->view->display('login');
  25. echo 'DUPA!';
  26. } else {
  27. //$_SESSION['logged'] = 1;
  28. echo 'Zalogowany!';
  29. //$this->menu();
  30. //$this->inbox();
  31. //print_r($_SESSION['connId']);
  32. }
  33. }
  34. }


No i chce sie dostac do metody klasy ktora zostala stworzona w MainController->setModel tak jak widac wyzej czyli :

  1. function mailbox() {
  2. echo 'login';
  3. $_SESSION['login'] = $_POST['login'];
  4. $_SESSION['pass'] = $_POST['pass'];
  5. if(($this->Model->connect('gmail.com',$_SESSION['login'],$_SESSION['pass'],'993','imap')) == false) {


Ale wywala mi blad :

[quote]
Notice: Undefined property: LoginController::$Model in C:\Apache\htdocs\PrackaMgr\controllers\class.LoginController.php on line 25

Fatal error: Call to a member function connect() on a non-object in C:\Apache\htdocs\PrackaMgr\controllers\class.LoginController.php on line 25
[/php]

Jezeli klasa LoginController dziedziczy po klasie MainController to chyba zmienna $this->Model powinna byc w jakis sposob rozpoznawana....jak to poprawic ? No i czy to wogole jest dobre rozwiazanie jesli chodzi o wzorzec MVC ? biggrin.gif

--------------------------------------------------------------------------------
Ok, z notice juz sobie poradzilem, wystarczylo zadeklarowac publiczna zmienna $Model

Ale zostal jeszcze ten fatal error czyli 'Call to a member function connect() on a non-object...'

Ten post edytował Wolfie 5.10.2009, 11:08:53
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
wookieb
post 5.10.2009, 11:08:51
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A gdzie w LoginController badz MainController masz zadeklarowana właściwość Model? A gdzie w LoginControllerze ustawiasz wartość dla $this->Model ?


--------------------
Go to the top of the page
+Quote Post
Wolfie
post 5.10.2009, 11:20:43
Post #3





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Edytowalem w tym samym czasie co Ty pisales, drugie pytanie odnosi sie do fatal error czy do notice ? smile.gif
Go to the top of the page
+Quote Post
nospor
post 5.10.2009, 11:23:37
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




skoro dostajesz fatala znaczy ze setModel nie zostało wykonane, a na pewnie nie przed tym fatalem. Teraz sobie poszukal dlaczego

setModel() jest wywolywane w dispatch() i to tylko gdy w post jest action. MOze tu lezy problem


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Wolfie
post 5.10.2009, 11:32:17
Post #5





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


Nie wydaje mi sie,

Zrobilem tak :

  1. private function setModel($model) {
  2. $className = $model.'Model';
  3. $this->Model = new $className;
  4. echo 'SET MODEL OK';
  5. }


No i teraz dostaje takie cos :

Cytat
Array ( [mailbox] => jakismail@gmail.com [pass] => jakieshaslo [controller] => login [action] => mailbox [Submit] => Zaloguj ) SET MODEL OKlogin
Fatal error: Call to a member function connect() on a non-object in C:\Apache\htdocs\PrackaMgr\controllers\class.LoginController.php on line 25


No wiec ewidentnie widac ze set model sie wykonuje poprawnie i to przed fatall errorem....

Ten post edytował Wolfie 5.10.2009, 11:32:34
Go to the top of the page
+Quote Post
wookieb
post 5.10.2009, 13:06:01
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




A pokaż teraz cały kod, oraz to jak wykonujesz wywołania mailbox i uzyskanie egzemplarza LoginController.


--------------------
Go to the top of the page
+Quote Post
Wolfie
post 5.10.2009, 13:47:39
Post #7





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

Ostrzeżenie: (20%)
X----


No wlasnie tak troche inwalidzko zrobione bo przenioslem poprostu czesc kodu ktora wywoluje model do LoginControllera, Main Controller wyglada tak samo tylko bez tej czesci kodu :

  1. if(isset($action)) {
  2. $model = ucfirst($action);
  3. $this->setModel($model);
  4. }


A LoginController tez tak samo tylko ze z ta czescia kodu :

  1. <?php
  2.  
  3. class LoginController extends MainController{
  4.  
  5. public $model;
  6.  
  7. function __construct($params) {
  8. $action = $params['action'];
  9.  
  10. if(isset($action)) {
  11. $model = ucfirst($action);
  12. $this->setModel($model);
  13. }
  14.  
  15. if(method_exists('LoginController', $action)) {
  16. $this->$action($params);
  17. } else {
  18. $this->defaultAction();
  19. }
  20. }
  21.  
  22. function defaultAction() {
  23. echo 'Widok logowania';
  24. $this->view = new LoginView;
  25. $this->view->display('login');
  26. }
  27.  
  28. function mailbox() {
  29. echo 'login';
  30. $_SESSION['login'] = $_POST['mailbox'];
  31. $_SESSION['pass'] = $_POST['pass'];
  32. if(($this->model->connect('gmail.com',$_SESSION['login'],$_SESSION['pass'],'993','imap')) == false) {
  33. //$this->view->display('login');
  34. echo 'DUPA!';
  35. } else {
  36. //$_SESSION['logged'] = 1;
  37. echo 'Zalogowany!';
  38. $this->view->display('mailbox');
  39. //$this->menu();
  40. //$this->inbox();
  41. //print_r($_SESSION['connId']);
  42. }
  43. }
  44. }
  45. ?>


Wiec teraz bede musial poprostu w kazdym nowym kontrolerze wywolywac w konstruktorze model, a chcialem to zrobic w MainControllerze zeby nie powtarzac kodu, troche pokombinowalem ale chyba musialbym przebudowac oba i to dosc znacznie wiec zostalem przy tej inwalidzkiej metodzie.....chyba ze masz jakies podpowiedzi winksmiley.jpg

Ten post edytował Wolfie 5.10.2009, 13:48:04
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:48