Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MVC - pobranie konkretnej akcji z kontrollera
Forum PHP.pl > Forum > PHP
damianooo
Witam,

Mam kilka kontrolerów odpowiedzielnych za różne rzeczy w aplikacji. I teraz tak. W zależności od tego co mam w adresie URL , metoda getController pobiera mi tablicę asocjacyjną z dwoma kluczami: "controller" (obiekt danej klasy) i "action" (string z nazwą akcji(metody)) . Każdy kontroller posiada swoje akcje(metody) , ale nie wiem jak taką metodę wywołać. Próbowałem to zrobić tak:

  1. $controller = Router::getController();
  2. $action = Router::getAction($controller['action']);
  3. $controller['controller']->$action();


ale niestety wywołanie metody nie działa sad.gif . Jak można to zrobić ?

dzięki




Spawnm
Zobacz tak:
  1. $c = new $controller;
  2. $c->$action();


Jak by nie działało to sprawdź var_dumpem czy aby na pewno istnieje taki model, oraz czy posiada akcję o którą prosisz.


Jak nie działa to dostajesz jakieś błędy?
damianooo
właśnie sprawdzałem var_dumpem ale nie dostaję żadnych błędów ...

w mojej klasie Router jest metoda getController, która zwracała:

  1. return array('controller' => new Frontend(), 'action' => 'getHomepage');


wywołanie miałem takie :

  1. require_once 'lib/Router.php';
  2. $controller = Router::getController();
  3. $action = $controller['action'];
  4.  
  5. $controller['controller']->$action();


zmieniłem więc w metodzie getController na tak:

  1. return array('controller' => 'Frontend', 'action' => 'getHomepage');


i w wywołaniu na tak jak zaproponowałeś:

  1. require_once 'lib/Router.php';
  2. $controller = Router::getController();
  3. $action = $controller['action'];
  4.  
  5. $c = new $controller['controller'];
  6. $c->$action();


ale również nic.

Klasa "Frontend" wygląda tak:

  1. class Frontend
  2. {
  3. public function getHomepage(){
  4. return 'test';
  5. }
  6. }
c1chy
Na szybko przykład, który działa:
  1. class Front{
  2.  
  3. public function foo(){
  4.  
  5. echo 'foo method';
  6.  
  7. }
  8.  
  9. }
  10.  
  11.  
  12. $routerResponse=array('controller'=>'Front','action'=>'foo');
  13.  
  14. $controller=new $routerResponse['controller'];
  15.  
  16. if (method_exists($controller,$routerResponse['action'])){
  17. $controller->$routerResponse['action']();
  18. }
  19.  


z twojego kodu wynika że podczas tworzenia nowego obiektu klasa Frontend nie jest wczytana ?
damianooo
ok , wielkie dzięki pomogłeś, Twój przykład bardzo pomógł ... źle odwoływałem się do utworzonego obiektu ... powinno być tak:


  1.  
  2. $controller = Router::getController();
  3. $controller = new $controller['controller'];
  4. $controller->$controller['action']();



Pozdrawiam
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.