Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> przekazywanie parametrów do akcji
Apo
post
Post #1





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

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


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Pozdrawiam
Go to the top of the page
+Quote Post
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%)
-----


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ść...
Go to the top of the page
+Quote Post
Apo
post
Post #3





Grupa: Zarejestrowani
Postów: 426
Pomógł: 1
Dołączył: 2.10.2005

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


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 ?
Go to the top of the page
+Quote Post
envp
post
Post #4





Grupa: Zarejestrowani
Postów: 359
Pomógł: 1
Dołączył: 16.04.2006
Skąd: Łódź

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


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ę.

Ten post edytował envp 14.08.2006, 12:31:13
Go to the top of the page
+Quote Post

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: 19.09.2025 - 01:29