Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> Budowa kontrolera
SongoQ
post 25.02.2007, 18:29:15
Post #21





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


@J4r0d Idac wskazowkami @mike_mech rowniez polecam rozejrzec sie po zrodlach SF odnosnie budowy class do akcji. Sa 2 mozliwosci 1 akcja, 1 klasa, 1 plik. Lub wiele akcji, 1 klasa, 1 plik (oczwiscie tutaj jest to uzaleznione od modulu).


--------------------
Go to the top of the page
+Quote Post
Jarod
post 11.03.2007, 19:38:38
Post #22





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Jeszcze raz przeglądałem tematy na tym forum dotyczące budowania kontrolera i czytałem m.in. takie wypowiedzi niektórych użytkowników: "Tu powinieneś zastosować forward() zamiast redirect()"

Czym w takim razie (chodzi mi o sposób implementacji) różni się redirect() od forward() ? Przecież oba opierają się o header()


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
LBO
post 11.03.2007, 21:39:28
Post #23





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Mylisz się redirect() to jest przekierowanie przez header, czyli następuje przeładowanie na następną stronę.
Natomiast forward jest wirtualne, bez przekierowania, jedna akcja wywołuje następną.
Go to the top of the page
+Quote Post
Jarod
post 11.03.2007, 21:50:02
Post #24





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(LBO @ 11.03.2007, 21:39:28 ) *
Natomiast forward jest wirtualne, bez przekierowania, jedna akcja wywołuje następną.


Czyli podajesz do forward jakiś argument, który jest nazwą akcji do wywołania?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
menic
post 11.03.2007, 21:55:34
Post #25





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


wyglada to mniej wiejcej tak $this->forward('modul', 'akcja', 'parametry'). Tak jest to u mnie zrobione.


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
Jarod
post 11.03.2007, 22:26:10
Post #26





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Ok jeszcze jedno: forward i redirect powinno być w kontrolerze czy routerze?

A jak masz redirect? $this->redirect($url) ?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
menic
post 12.03.2007, 09:27:13
Post #27





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


W kontrolerze. Kontroler pobiera z routera url na który ma byc przekierowany w przypadku redirect
  1. <?php
  2. public function redirect( $sUrl )
  3. {
  4. header( "Location: " . _SPARKLE_WEB . _SEP . swRouter::makeUrl( $sUrl ) );
  5. }
  6. ?>


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
Ociu
post 13.03.2007, 13:44:35
Post #28





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




No nie wiem, dla mnie forward jest w kontrolerze, a reditect w Response (wysyłanie nagłówka).
Go to the top of the page
+Quote Post
menic
post 13.03.2007, 13:49:51
Post #29





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


Teoretycznie tak, ale praktycznie jest lepiej w controlerze. Ew. w kontrolerze mozna zrobic nakladke na response winksmiley.jpg


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
mike
post 13.03.2007, 13:54:35
Post #30





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Moim zdaniem (i nie tylko moim bo tak jest w Mojavi, Agavi, Symfony a nawet w CakePHP) controller jest odpowiedzialny zarówno za redirect jak i za forward.

Jest to dla mnie całkowicie naturalne.
forward jets to przerzucenie się na inną akcję podczas tego samego żądania a redirect jest to przeskoczenie na inną akcję z wykonaniem kolejnego żądania. Nie jest to do końca zwrócenie responsea (pomimo tego że wymaga to zwrócenia nagłówków).
Obie powyższe decyzje są decyzjami, które powinien podjąć kontroler i to on powinien się tym zająć.

Za tym rozwiązaniem stoi chmara developerów i jest to rozwiązanie stare i sprawdzone. Nie widzę tu nic nad czym trzeba debatować tongue.gif
Go to the top of the page
+Quote Post
menic
post 13.03.2007, 14:03:32
Post #31





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

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


@mike_mech: Zgadzam sie. Ale jesli mamy klase typu response która zarzadza w jakis tam sposób wysylanymi nagłowkami to takie redirect() powinno być nakladką na taką klase.


--------------------
Jak masz cos zrobic dobrze...
...To musisz zrobić to sam.

Uchwycić moment...
Go to the top of the page
+Quote Post
mike
post 13.03.2007, 14:13:41
Post #32





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Cytat(menic @ 13.03.2007, 14:03:32 ) *
@mike_mech: Zgadzam sie. Ale jesli mamy klase typu response która zarzadza w jakis tam sposób wysylanymi nagłowkami to takie redirect() powinno być nakladką na taką klase.
Dokładnie. Też twierdzę że technicznie powinien to być mechanizm wykonywany przez Responsea a tylko ewentualnie uruchamiany przez Controllera.
Powinien pójść nagłówek z kodem 302 i wszystko jasne smile.gif

  1. <?php
  2. abstract class sfWebController extends sfController {
  3.  
  4. // ...
  5.  
  6. /**
  7.    * Redirects the request to another URL.
  8.    *
  9.    * @param string An existing URL
  10.    * @param int A delay in seconds before redirecting. This is only needed on
  11.    *  browsers that do not support HTTP headers
  12.    * @param int The status code
  13.    */
  14. public function redirect($url, $delay = 0, $statusCode = 302)
  15. {
  16. $response = $this->getContext()->getResponse();
  17.  
  18. // redirect
  19. $response->clearHttpHeaders();
  20. $response->setStatusCode($statusCode);
  21. $response->setHttpHeader('Location', $url);
  22. $response->setContent(sprintf('<html><head><meta http-equiv="refresh" content="%d;url=%s"/></head></html>', $delay, htmlentities($url, ENT_QUOTES, sfConfig::get('sf_charset'))));
  23.  
  24. if (!sfConfig::get('sf_test'))
  25. {
  26. $response->sendHttpHeaders();
  27. }
  28. $response->sendContent();
  29. }
  30.  
  31. // ...
  32. }
  33.  
  34. ?>
Go to the top of the page
+Quote Post
Jarod
post 13.03.2007, 22:33:12
Post #33





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


@mike-mech: co robi metoda $this->getContext() ?

Jak wygląda metoda clearHttpHeaders() i setHttpHeaders()?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
mike
post 14.03.2007, 07:11:51
Post #34





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Powyższa funkcja to tylko przykład, który miał mniej więcej zobrazować to co się dzieje. Jest to część fragment klasy sfWebController z Symfony.
Po szczegóły odsyłam do sfWebResponse smile.gif
Go to the top of the page
+Quote Post
Ociu
post 15.03.2007, 17:14:30
Post #35





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




Pewnie jak w większości frameworków:
  1. <?php
  2. public function getContext()
  3. return $this->context;
  4. }
  5. // --------------------
  6. public function setHttpHeaders($strHeaderName, $strHeaderValue)
  7. {
  8. $this->arrHeaders[$strHeaderName] = $strHeaderValue;
  9. }
  10. // --------------------
  11. public function clearHttpHeaders()
  12. {
  13. $this->arrHeaders = array();
  14. }
  15. ?>

smile.gif
Oczywiście nazwy mogą się różnić.
A co do dyskusji. Imho, nie ma nad czym się rozwodzić. Interpretacji jest tyle, ilu programistów. Każdy robi po swojemu.
Go to the top of the page
+Quote Post

2 Stron V  < 1 2
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.04.2024 - 21:18