Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kontroler, akcje ale trochę inaczej.
Joachim Peters
post
Post #1





Grupa: Zarejestrowani
Postów: 196
Pomógł: 2
Dołączył: 1.03.2006

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


Witam,

Ostatnio trochę czytałem na temat MVC i tak naprawdę tylko niektóre rzeczy z tego mi się podobają, nie wiem może jeszcze nie dostrzegam za wielu plusów, ale chce zastosować u siebie coś podobnego. Napisałem sobie klasę router i request, pierwsza pobiera dane z adresu, druga z formularzy, cookies, sesji i obsługuje dane z routera, klasę FrontController, które uruchamia moduł i tworzy instancję i klasę Action, uruchamia akcję (wywołuje metodę klasy).
Kodowo wygląda to mniej więcej tak:
  1. <?php
  2.  
  3. class FrontController {
  4.  public $module;
  5.  public $action;
  6.  public $objectAction;
  7.  
  8. public $request;
  9.  
  10. public function __construct(HttpRequest $request) {
  11. $this->request = $request;
  12.  
  13. $this->module = strtolower($this->request->get('get', 0));
  14. $this->action = strtolower($this->request->get('get', 1));
  15.  
  16. $this->runModule();
  17. }
  18.  
  19. public function runModule() {
  20. if(file_exists('./modules/user/'.$this->module.'.php')) {
  21. include_once('./modules/user/'.basename($this->module.'.php'));
  22.  
  23. $module = ucfirst($this->module);
  24.  
  25. $this->objectAction = new $module();
  26. } else {
  27. throw new Exception('Nie można znaleźć plików modułu');
  28. }
  29. }
  30. }
  31.  
  32. class Action {
  33.  private $controller;
  34.  
  35.  public function __construct(FrontController $controller) {
  36. $this->controller = $controller;
  37.  
  38. $this->runAction();
  39. }
  40.  
  41. public function runAction() {
  42. if(!is_null($this->controller->objectAction)) {
  43.  $action = $this->controller->action;
  44.  
  45. $this->controller->objectAction->$action();
  46. } else {
  47. throw new Exception('Brak akcji');
  48. }
  49. }
  50. }
  51.  
  52. $controller = new FrontController($request);
  53. $action = new Action($controller);
  54.  
  55. ?>

Jak powiecie czy to rozwiązanie jest optymalne, warto to dalej kodować, czy lepiej zabrać się za kodowanie 'standardowe' - z wprowadzaniem argumentów do funkcji itd.?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Joachim Peters
post
Post #2





Grupa: Zarejestrowani
Postów: 196
Pomógł: 2
Dołączył: 1.03.2006

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


Mam teraz taki kod:
  1. <?php
  2.  
  3. class FrontController {
  4.  public $moduleName;
  5.  public $actionName;
  6.  
  7.  public $oModule;
  8.  
  9. public $request;
  10.  
  11. public function __construct(HttpRequest $request) {
  12. $this->request = $request;
  13.  
  14. $this->moduleName = strtolower($this->request->get('get', 0, 'htmlspecialchars'));
  15. $this->actionName = strtolower($this->request->get('get', 1, 'htmlspecialchars'));
  16. }
  17.  
  18. public function run() {
  19. $this->runModule();
  20. }
  21.  
  22. private function runModule() {
  23. if(file_exists('./modules/user/'.$this->moduleName.'.php')) {
  24. include_once('./modules/user/'.basename($this->moduleName.'.php'));
  25.  
  26. $moduleName = ucfirst($this->moduleName);
  27.  
  28. if(class_exists($moduleName)) {
  29. $this->oModule = new $moduleName();
  30. $this->oModule->runAction($this->actionName);
  31. } else {
  32. throw new Exception('Moduł <i>'.$this->moduleName.'</i> nie istnieje.');
  33. }
  34. } else {
  35. throw new Exception('Nie można znaleźć pliku modułu <i>'.$this->moduleName.'</i>.');
  36. }
  37. }
  38. }
  39.  
  40. interface Module {
  41. public function runAction($action);
  42. }
  43.  
  44. class AbstractModule implements Module {
  45. public $controller;
  46.  
  47.  public function __construct(FrontController $controller) {
  48. $this->controller = $controller;
  49. }
  50.  
  51. public function runAction($action) {
  52. if(method_exists($this->controller->oModule, $action)) {
  53. $this->controller->oModule->$action();
  54. } else {
  55. throw new Exception('Akcja <i>'.$action.'</i> nie istnieje.');
  56. }
  57. }
  58. }
  59.  
  60. $controller = new FrontController($request);
  61. $module = new AbstractModule($controller);
  62. // tutaj klasa modułu z 'extends AbstractModule
  63. $controller->run();
  64. ?>

i pokazuje błąd Fatal error: Argument 1 passed to AbstractModule::__construct() must be an object of class FrontController...on line 47
Go to the top of the page
+Quote Post

Posty w temacie


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: 4.10.2025 - 11:11