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 tak:
  1. <?php
  2.  
  3. class FrontController {
  4.  private $moduleName;
  5.  private $actionName;
  6.  
  7.  private $oModule;
  8.  
  9. private $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. abstract class AbstractModule implements Module {
  45. public function runAction($action) {
  46. if(method_exists($this, $action)) {
  47. $this->$action();
  48. } else {
  49. throw new Exception('Akcja <i>'.$action.'</i> nie istnieje.');
  50. }
  51. }
  52. }
  53.  
  54. $controller = new FrontController($request);
  55. $controller->run();
  56. ?>


Pytanie i problemy:
1. Chciałbym jeszcze zrobić, żeby w module było można używać funkcji i danych z klasy request bez potrzeby tworzenia instancji w każdej z klas gdzie ma być to użyte.
2. Nie bardzo rozumiem, jaki sens jest w tworzeniu typu wyjątku takiego jaki podałeś?
3. Co teraz z szablonami? Chce użyć zwykłej składni PHP w HTML-u w plikach .php i czy robić do wczytywania tego jakąś osobną klasę czy w metodach modułów dawać po prostu include?
4. Czy jestem taki toporny czy mi się tylko wydaję? (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Ten post edytował Joachim Peters 31.08.2007, 15:55:27
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: 9.10.2025 - 19:04