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%)
-----


Trochę nie tędy droga. Zacznijmy od front kontrolera, który ma właściwości publiczne - powinny być prywatne.

Usunąłeś słowo kluczowe abstract z definicji klasy AbstractModule, która miała być abstrakcyjna. Nie możesz utworzyć instancji tej klasy, bo ona nic nie robi... Posiada tylko metodę runAction, która na podstawie nazwy akcji wywołuje odpowiednią metodę. Te metody musisz już napisać sam w klasie dziedziczącej AbstractModule.

W przypadku tej konstrukcji, nie widzę sensu w podawaniu do konstruktora klasy modułu instancji front controllera. Na nic on nie jest potrzebny w tej klasie...

Metoda runAction() w AbstractModule jest źle napisana - po co wyciągać obiekt modułu z front controllera? Przecież front controllera wywołuje tę metodę dla odpowiedniego modułu, dlatego runAction() operuje na składowych instancji, dla której została wywołana. Dlatego powinno być:

  1. <?php
  2. public function runAction($action) {
  3. if(method_exists($this, $action)) {
  4. $this->$action();
  5. } else {
  6. throw new Exception('Akcja <i>'.$action.'</i> nie istnieje.');
  7. }
  8. }
  9. ?>


Warto wyrzucić do tego jakiś lepszy wyjątek, typu NoActionException. Komunikat nic Ci tak na prawdę nie daje w kodzie. Po typie wyjątku możesz już manipulować przechwytywaniem...

Warto też do akcji jakoś przekazać obiekt żądania.
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: 24.08.2025 - 04:28