Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wywolanie metody/zmiennej z klasy przodka
Forum PHP.pl > Forum > Przedszkole
Wolfie
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...'
wookieb
A gdzie w LoginController badz MainController masz zadeklarowana właściwość Model? A gdzie w LoginControllerze ustawiasz wartość dla $this->Model ?
Wolfie
Edytowalem w tym samym czasie co Ty pisales, drugie pytanie odnosi sie do fatal error czy do notice ? smile.gif
nospor
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
Wolfie
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....
wookieb
A pokaż teraz cały kod, oraz to jak wykonujesz wywołania mailbox i uzyskanie egzemplarza LoginController.
Wolfie
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
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.