Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: przekazywanie parametrów do akcji
Forum PHP.pl > Forum > PHP > Object-oriented programming
Apo
Witam
Zastanawiałem się ostatnio jak sprawdzić czy w adresie jest podana wystarczająca ilośc parametrów które trzeba przekazać do metody jako argumenty. Pierwszy problem to przekazanie ich do metody w odpowiedniej kolejności np:

  1. <?php
  2. class viewAction extends Action {
  3.  
  4. public function execute($idNewsa, $sort, $param3) // to trzeba przekazac w odpowiedniej kolejności
  5. {
  6.  
  7. }
  8.  
  9. }?>


adres mam w postaci: http://page.pl/controller/action/idNewsa/5...ytitle/param3/n
no i gdy rozdziele adres, tablica jest typu:
array('idNewsa' => 5, 'sort' => 'bytitle', 'param3' => 'n');

No i jak je przekazać do funkcji w poprawnej kolejności. Jeśli inaczej rozwiązaliście ten problem u siebie to piszcie smile.gif

Pozdrawiam
Ludvik
Osobiście nie lubię dynamicznego wywoływania metod, dlatego takie rozwiązanie nie przypadło mi do gustu.

Pierwszy pomysł, to zbieranie danych w kontenerze, który następnie przekazujemy do akcji w momencie jej wywołania.

Możesz również utworzyć metodę, która posłuży do zbierania parametrów...
Kod
setParameter(mixed name, mixed value)


Tak czy inaczej, wszystkie te podejścia wymagają pewnego rodzaju mapowania parametrów z URL do ich nazw (przy Twoim podejściu - kolejności) w akcji. Najlepiej zrobić to w Routerze. Tutaj masz pełną dowolność...
Apo
No właśnie mam teraz coś w rodzaju kontenera. Router odczytuje parametry i przekazuje do dispathera w postaci tablicy z parametrami, która następnie jest przesyłana do klasy akcji. W klasie akcji dostępna jest metoda getParam($name); która zwraca pożądany parametr. Obiekt akcji tworzy klasa Dispather:

  1. <?php
  2. // ... dispather
  3. require_once($url_na_podstawie_get);
  4. $_action = new $_action;
  5. $action->_init($HttpContext, $parameters); // ta metoda zapisuje parametry i context w klasie oraz wywołuje metode Execute
  6. // ... end dispather
  7.  
  8. // metoda _init w klasie akcji:
  9.  
  10. final public function _init(HttpContext $context, $params)
  11. {
  12. $this->context = $context;
  13. $this->parameters = $params;
  14. $this->execute();
  15. }
  16. // end
  17. ?>


No i teraz chciałem w metodzie _init() np sprawdzić czy wszystkie parametry zostały podane w przeciwnym razie zostaniemy przekierowani do innej akcji, ale nie wiem jak to poprawnie rozwiązać bo trzeba gdzieś trzymać wymagne parametry, narazie myślałem nad trzymaniem ich w bazie ale to jest raczej niewydajny sposób. Kolejnym moze być utworzenie w klasie akcji składowej $required_params = array('param1', 'paramn'); gdzie będą wypisane wszystkie parametry potrzebne do wywołania akcji.

Co o tym sądzicie ?
envp
Może dobrym pomysłem byłoby poprostu sprawdzanie w każdej akcji osobno czy ma odpowiednie parametry
Możesz dla każdej akcji zrobić "rodzica" który miałby, coś takiego (pomysł zaczerpnięty z Zend_Config):

  1. <?php
  2. 1: class Zend_Config implements Countable, Iterator
  3.  2: {
  4.  3: 
  5.  4: protected $_allowModifications;
  6.  5: protected $_iterationPointerValid;
  7.  6: protected $_data;
  8.  7: 
  9.  8: public function __construct($array, $allowModifications = false)
  10.  9: {
  11. 10: $this->_allowModifications = $allowModifications;
  12. 11: foreach ($array as $key => $value) {
  13. 12: if ($this->_isValidKeyName($key)) {
  14. 13: if (is_array($value)) {
  15. 14: $this->_data[$key] = new Zend_Config($value, $allowModifications);
  16. 15: } else {
  17. 16: $this->_data[$key] = $value;
  18. 17: }
  19. 18: } else {
  20. 19: throw new Zend_Config_Exception("Invalid key: $key");
  21. 20: }
  22. 21: }
  23. 22: }
  24. 23: 
  25. 24: public function __get($name)
  26. 25: {
  27. 26: $result = null;
  28. 27: if (isset($this->_data[$name])) {
  29. 28: $result = $this->_data[$name];
  30. 29: }
  31. 30: return $result;
  32. 31: }
  33. 32: 
  34. 33: public function __set($name, $value)
  35. 34: {
  36. 35: if ($this->_allowModifications) {
  37. 36: if (is_array($value)) {
  38. 37: $this->_data[$name] = new Zend_Config($value, true);
  39. 38: } else {
  40. 39: $this->_data[$name] = $value;
  41. 40: }
  42. 41: } else {
  43. 42: throw new Zend_Config_Exception('Zend_Config is read only');
  44. 43: }
  45. 44: }
  46. 45: }
  47. ?>

potem sprawdzasz, w pliku konkretnej akcji:
  1. <?php
  2. class Error403Action extends Zend_Config //oczywiście u Ciebie Class Error403Action extends Action 
  3. {
  4. public __construct()
  5. {
  6. if (!isset($this->twojparamter)) throw new NoParamActionExeption();
  7. }
  8. }
  9. ?>


Oczywiście we FrontControlerze łapiesz NoParamActionException i kierujesz usera na odpowiednią stronę.
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.