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
Ludvik
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Powiązania, jak sam zauważyłeś, są złe. Zacznijmy od tego, że Front Controller nie jest akcją - on wywołuje akcje, a to zupełnie inna relacja. Jeżeli chcesz podzielić działanie w stylu: moduł = klasa, akcja = metoda, to bym proponował stworzenie interfejsu modułu:

  1. <?php
  2. interface Module {
  3. function runAction($action);
  4. }
  5. ?>


U Ciebie za moduł robił Sub Controller, ale nazwa Module wydaje się logiczniejsza moim zdaniem, szczególnie, że używasz jej w nazwie metody runModule(). Możesz pokusić się o stworzenie klasy abstrakcyjnej, albo zastąpić nią interfejs:

  1. <?php
  2. abstract class AbstractModule implements Module {
  3. public function runAction($action) {
  4. if(method_exists($this->frontController->oAction, $action)) {
  5. $this->frontController->oAction->$action();
  6. } else {
  7. throw new NoActionException();
  8. }
  9. }
  10. }
  11. ?>


Front Controller jest ok, tylko usuń to dziedziczenie... Do tego bym odpalał obsługę żądania nie w konstruktorze, ale osobnej metodzie np. run().
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: 27.09.2025 - 17:35