![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Witam od czasu do czasu przez ucho owinie mi sie cos na temat forward() i redirect().
Z tego co mi wiadomo i co dalem rade wygrzebac z symfony i zf to redirect() to zwykle przekierowanie za pomoca header/meta fresh'a na dany kontroler i jego akcje z przeladowaniem strony. A forward() to nastepna akcja do odpalenia bez przeladowania strony. No i teraz pytanie gdzie i jak tego uzywac? Powiedzmy ze redirect() wiem jak zaimplementowac i po co ale forward() nie wiem nawet po co a o tym jak to juz nie wspomne. Tak zeby juz nie zakladac nastepnego watku mam tez pytanie dotyczace zasad routingu ostatnio byl temat na forum o tym ze np routes wyglada tak: Cytat /:Lang/:controller/:action I do tego cala implementacja na podstawie tego configu jednak nie wiedzialem po co tak kombinowac u mnie mma na stale przy url: Cytat index.php/Home,Index,ShowAllNews Frontcontroller = Home Action Frontcontrollera = Index Akcja komponentu/pluginu = ShowAllNews. Ogolnie jezyk w moim fw wybiera sie defaultowo przy tworzeniu obiektu klasy Language ktory jest zapisywany do cookie lub za jak ktos chce moze zrobic maly form lub flagi z akcja i przekazac jezyk do metody setLang() ktora ustawi jezyk. Jednak nie byloby glupie gdybym mogl sobie zmienic tak router by moc miec 2 mozliwosci: Cytat /:controller/:action/:cpaction Lub: Cytat /:lang/:controller/:action/:cpaction I wtedy zamiast poprzez form/flagi zapisywac lang z 1 parametru url'a. Jednak nie wiem zabardzo jak to zautomatyzowac by za pomoca zasad routingu Router robil wszystko automatycznie. Jesli ktos chce moge mu podac klase Router wtedy mi podpowie. -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Ten FW jest do Twojego użytku? To po co chcesz w nim implementować coś z czego nawet nie będziesz korzystać?
1) Przykład zastosowania forward z symfony? Powiedzmy, że mamy akcje wyświetlania czegoś z bazy - np. profil użytkownika. Ktoś podaje adres, ale okazuje się, że użytkownika o podanym ID nie ma, więc co robimy? Wyświetlany błąd 404, czyli wykonujemy forwarda do akcji 404. Inny przykład: mamy ankiety. Ktoś wypełnia ją, formularz jest wysyłany, głos dodany, a nam ma się wyświetlić wynik ankiety (po uwzględnieniu naszego głosu). No to robimy forwarda na akcję wyświetlającą wyniki danej ankiety. 2) O ilę się nie mylę w symfony jest to zrobione tak, że forward wyrzuca wyjątek typu ABCzrobForwarda. Nie wiem dokładnie jak to jest zrobione, ale mogłoby to wyglądać tak:
3) IMO zapisywanie reguł w formie Kod /:Lang/:controller/:action Jest bez sensu (przynajmniej w symfony). Lepiej jest odpowiednio zmodyfikować klasę route-ingu, tak by automatycznie dodawała/rozpoznawała czy istnieje fragment dot. języka - w końcu jest to używane na każdej podstronie. Chociaż w sumie najlepiej to język wepchać jako subdomenę - napewno nie jako cookie - nie można wtedy podesłać znajomemu linka w normalnym (dla niego) języku.
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Cytat 1) Przykład zastosowania forward z symfony? Powiedzmy, że mamy akcje wyświetlania czegoś z bazy - np. profil użytkownika. Ktoś podaje adres, ale okazuje się, że użytkownika o podanym ID nie ma, więc co robimy? Wyświetlany błąd 404, czyli wykonujemy forwarda do akcji 404. Inny przykład: mamy ankiety. Ktoś wypełnia ją, formularz jest wysyłany, głos dodany, a nam ma się wyświetlić wynik ankiety (po uwzględnieniu naszego głosu). No to robimy forwarda na akcję wyświetlającą wyniki danej ankiety. No to forward() juz wiem przekierowanie do jakiegos kontrolera/akcji gdy cos poszlo nie tak lub bo jakie zmianach mnie wiecej ogoonie wiem o co kaman. A redirect() w tym przypadku bo nie wiem? Co do subdomen to masz racje ale na darmowych srv owych nie ma a z tym tez trzeba sie liczyc ![]() Cytat Jest bez sensu (przynajmniej w symfony). Lepiej jest odpowiednio zmodyfikować klasę route-ingu, tak by automatycznie dodawała/rozpoznawała czy istnieje fragment dot. języka - w końcu jest to używane na każdej podstronie Racja zaduzo kombinowania by z tym bylo lepiej dac 2 opcje jezyk w cookie lub w url i zintegrowac klase router z lanuage by ze soba wspolpracowaly dzis to dokoncze i pokaze jak ktos bedzie chetny by zobaczyc. -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Co do subdomen to masz racje ale na darmowych srv owych nie ma a z tym tez trzeba sie liczyc Że tak powiem... nie bądź śmieszny. ![]() EDIT: forward - serwer sobie robi przekierowanie, redirect - użytkownik zostaje przekierowany na inny adres. EDIT2: vokiel to ładnie ujął Ten post edytował Crozin 26.10.2009, 18:42:51 |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
No chyba jest to trochę inaczej. Różnica jest niewielka. Ogólnie rzecz biorąc opiera się na:
forward odnosi się do części aplikacji i jest transparentne dla użytkownika, adres pozostaje taki sam, redirect jest bardziej dla przeglądarki niż systemu (aplikacji www), powoduje wywołanie nowego requesta, zmienia url w pasku adresu Czyli forward jest wewnątrz aplikacji, np przekazanie działania do innej metody, klasy (niewidoczny dla użytkownika). Natomiast redirect jest właśnie dla użytkownika, przenosi go jawnie na inny adres url. -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Forward mozna uzyc gdy dodajemy posta lub komentarz do jakiegos news'a wtedy by go zobaczyc strona musi sie przeladowac robimy forward() na taki sam adres.
A redirect jestesmy na stronie: Cytat index.php/Home,Index,ShowProfil,2 Wysiwetlamy profil user'a o id 2 np klikamy na logout i robie redirect na index.php i tyle? Dobrze zrozumialem? Jesli nie to prosze o jakis praktyczny przyklad. -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]()
Post
#7
|
|
![]() Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 ![]() |
1. Redirect - przekierowanie do innej akcji. Najlepszy przykład - jesteś na formularzy edycji użytkownika, zapisujesz dane do bazy, następuje redirect, czyli "kliknięcie" w nowy adres.
2. Forward - przekazanie sterowania do innej akcji. Najlepszy przykład - autoryzacja - chcesz wejść na jakąś stronę, ale zamiast treści pokazuje Ci się formularz logowania, mimo, że adres wskazuje na tą treść, np artykul-123.html. Dopiero jak się zalogujesz będziesz mógł przeczytać treść. Forward spowodował, że sterowanie przekazano do akcji logowania, bez konieczności przeładowania strony. -------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Cytat 1. Redirect - przekierowanie do innej akcji. Najlepszy przykład - jesteś na formularzy edycji użytkownika, zapisujesz dane do bazy, następuje redirect, czyli "kliknięcie" w nowy adres. A nie rediretc() na referer? A jak na nowy adres tzn np? Cytat 2. Forward - przekazanie sterowania do innej akcji. Najlepszy przykład - autoryzacja - chcesz wejść na jakąś stronę, ale zamiast treści pokazuje Ci się formularz logowania, mimo, że adres wskazuje na tą treść, np artykul-123.html. Dopiero jak się zalogujesz będziesz mógł przeczytać treść. Forward spowodował, że sterowanie przekazano do akcji logowania, bez konieczności przeładowania strony. krotko mowiac przykladowy kod:
Dobrze kumam? Sorki ze tak lamersko pytam ale wydaje mi sie to przydatne a nie chcielam wynajdowywac kola na nowo i dlatego tak dokladnie pytam. P.S ktorko mowiac forward() pozwala nam na wykonanie danego komponentu/pluginu wewnatrz innego. Ten post edytował marcio 26.10.2009, 23:33:33 -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
No czyli tak jak pokazalem jest good.
Dzis sprobuje to zaimplementowac potestuje i jak cos zwroce sie do was ogolnie macie + ![]() Witam zrobile juz redirect() i forward() jednak mam jeden problem z forward(). Bazujac sie na przykladzie @batman mam komponents upload ktory jest ladowany. Jego kontroler ma defaultowa funckje Index() ktora sie wywoluje sie na samym poczatku(chyba ze w url jest podana inna metoda do wykonania) ma ona za zadanie wyswietlic formularz uploadu i po submitowaniu forma przekierowac na: Cytat index.php/Home,Index,Upload I wszystko dziala pliki sue uploaduja. Jednak teraz chce zrobic tak ze trzeba byc zalogowanym by uploadowac pliki w przeciwnym wypadku pokazuje laduje komponent Auth za pomoca forward gdy user sie zaloguje to widzi zamiast Logowania form do upload'u: Tak wyglada funkcja Index() z kontrolera komponentu Uploader:
A tu implementacja Forward()
Ale jest jedno ale wszystko dziala tylko GDY na stronie mam tak czy siak zaladowany komponent Auth gdy go nie ma owszem Form logowania sie pokazuje ale jak juz kilkamy na Login i zostajemy przekierowani na: Cytat index.php/Home,Index,Auth To nas nie loguje nic sie nie dzieje. Gdy komponent logowania jest zawsze i do tego w komponencie uploadu gdy ktos nie jest zalogowany widac formularz logowania moge sie zalogowac poprzez samo komponent Auth jak i poprzez form wygenerowany przez Upload. Gdy usune ze strony komponent Auth widzimy formularz ale sama akcja logowania nie dziala. http://marcio.ekmll.com/index.php Tutaj jest testowa strona gdzie testuje wszystko z mojego fw wiec nie patrzcie na wyglad poprostu zrobilem przyklad by mozna bylo zobaczyc online co jest nie tak. Na stronie mamy komponent Auth(1 formularz), i komponent Upload(2 formularz pokazuje sie on bo nie jestesmy zalogowani). Zalogowac mozna sie poprzez obydwa formularze i zobaczymy upload jednak gdy usune pierwszy formularz logowania(komponent Auth) jest form ale nie da sie zalogowac. Co jest zle. P.S ale dlugi post ale musialem wszystko dokladnie opisac. P.S2 Zalogujcie sie za pomoca login: marcio i haslo: marcio OK rozwiazalem wszystko. Poniewaz moj system wczytuje komponenty/pluginy z bazy i wykonuje na nich odpowiednie metody robiac foward() wczyta sie pierwsza metoda jesli jednak w systemie dany komponent nigdzie nie zostal zaladowany druga metoda ktora jest np w method="" atrybutu form sie nie wykona bo nie znajdzie zadnego komponentu z taka metoda. Wiec mam 3 rozwiazania mozna jest stosowac wszystkie zaleznie od sytuacji: 1)Gdy komponent jest zawsze ladowany np logowanie wydaje mi sie ze jest prawie zawsze albo form albo panle po zalogowaniu Robimy tak jak pokazalem wyzej:
2)Gdy komponent nie jest zawsze wczytywany lub w ogole to robimy to na 2 sposoby:
Albo mozna tak zaimplementowac metode Index/Auth by wyswietlala form i zarazem logowala zaleznie od tego czy ktos jest zalogowany lub nie jak nie jest wyswietla form i pootem loguje jesli go wyslano jak jest zalogowany albo panel albo nic ![]() Moze troche przekombinowane ale wazne ze dziala i idea jest taka sama jak w innych fw. Ten post edytował marcio 28.10.2009, 15:37:06 -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Tak, ale implementacja tego jest beznadziejna.
Tutaj bardzo prymitywny przykład (pisany na baaaaardzo szybko - bo już spóźniony jestem :])
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Nie rozumiem czemu jest do dupy dziala tak samo implementacja zalezy od programisty wiec moze mi wytlumaczysz co jest nie tak?
Bo dzialanie jako takie jest takie same ![]() -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1) Forward, nie przerywa pracy aktualnej akcji
2) DRY - w forwardzie powtarzasz się (metoda wywoływania danej akcji) |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Cytat 1) Forward, nie przerywa pracy aktualnej akcji Gdzie ja przerywa?Bo ja nie wiem. Ad 2 nie rozumie kompletnie o co kaman ![]() EDIT:
Zapewnie chodzi o ten fragment kodu tak jak napisalem akurat przykladowy komponent logowania zaimplementowalem tak jak zaimplementowalem, jesli to zmienie wszystko bedzie good lub gdy dany komponent jest zawsze na danej stronie tak samo, zreszta jak bys przeczytal dokladnie moj post nr 10 od EDIT'a to jest tam wszystko napisane. Ten post edytował marcio 30.10.2009, 00:04:11 -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 304 Pomógł: 51 Dołączył: 4.02.2005 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Cytat 1) Forward, nie przerywa pracy aktualnej akcji Gdzie ja przerywa?Bo ja nie wiem. @Crozin miał na myśli, że forward powinien przerywać działanie akcje i natychmiast przekierować do następnej. Tak to jest w symfony, w ZF jest inaczej, forward nie przerywa działania akcji tylko dodaje do łańcucha akcji kolejną. Podsumowywując: forward nie musi przerywać akcji, zrób jak ci wygodniej, ale ta implementacja którą dałeś jest bardzo biedna, ona nie przekierowywuje do akcji tylko wywołuje odpowiednią metodę innego kontrolera wewnątrz innej (w środku) akcji, a to jest różnica. W twojej implementacji gdy zrobisz forwarda nie zmieniasz widoku, nie przekazujesz parametrów żądania do kontrolera akcji (żądanie nie jest chyba singletonem w twoim przypadku? nie widze jego przekazania) itp. Forward to nie tylko "wywołanie metody akcji jakiegoś innego lub tego samego kontrolera". -------------------- |
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 2 291 Pomógł: 156 Dołączył: 23.09.2007 Skąd: ITALY-MILAN Ostrzeżenie: (10%) ![]() ![]() |
Cytat W twojej implementacji gdy zrobisz forwarda nie zmieniasz widoku, nie przekazujesz parametrów żądania do kontrolera akcji (żądanie nie jest chyba singletonem w twoim przypadku? nie widze jego przekazania) itp. Forward to nie tylko "wywołanie metody akcji jakiegoś innego lub tego samego kontrolera". Ok thx. Przegladalem symfony i zf ale jest to tam zabardzi zagmatowane. Moze macie jakies wlasne implementacje forward() ktora moglibyscie mi pokazac? EDIT: Cytat W twojej implementacji gdy zrobisz forwarda nie zmieniasz widoku Widok jest zmieniany poprzez akcje z danego kontrolera. Cytat nie przekazujesz parametrów żądania do kontrolera akcji (żądanie nie jest chyba singletonem w twoim przypadku? nie widze jego przekazania) Nie nie jst singletonem ale co mu mam przekazywac. EDIT2: Zaraz zaczne kodzic juz wiem o co biega z tymi lancuchami akcji zaimplementuje to na tym samym przykladziei pokaze thx. Wykombinowalem cos takiego:
Jak narazie mozna wykonac 3 akcje i tylko ostatnia zwraca nam wynik w postaci html. Zrobilem to tak bo mi jest wygodnie, choc nie jest to napewno w 100% forward() ktore wy znacie z symfony czy zf(choc jest bardziej podobne do tego z zf). Ogolnie rzecz biorac taka implementacja forward() moze sie przydac gdy chcemy wywolac kilka akcji pod rzad bez przeladowania strony i tylko ostatnia akcja zwraca nam wynik w postaci html(w moim przypadku). Moze zdac egzanim gdy usuwamy news'a i chcemy na nowo wyswietlic wszystkie bez przeladowania strony robimy to za pomoca forward() lub ten sam efekt mozna uzyskac za pomoca redirect() z przeladowaniem strony. Ogolnie ta implementacje co podalem wyzej to troche rozbuduje raczje ale wczesniejsza funckja forward() tez zostanie zmienie jej nazwe bo przy jednej funkcji sie zda bardziej niz te nowe forward(); Ten post edytował marcio 30.10.2009, 14:06:23 -------------------- Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/ Moj blog |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 02:24 |