Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Filtry "przed" i "po". Problematyka.
Pucy
post 19.06.2006, 23:50:50
Post #1





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 8.05.2006

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


1. Jaka jest ich wlasciwie koncepcja? Staram sie dojsc z czase mdo tego, ze prefilt wykonuuje sie przed wykonaniem ackji w celu przygotowania odpowiednich danych poczatkowych lub warunkow jakie ma spelniac sygnal wejsciowy i after filtr, wlsnie po co? Ja rozumiem zwalniac pamiec w C itd... ale jezeli skrypt sie wykonuje i wszystkie dane, zmiennie i wartosci gina po zakonczeniu skryptu (oczywiscie bez sesji i cookie itd) to wlasnie nie rozumeim zastosowania tego zbytnio.

2. Drugie moje pytanie/problem. Czy warto nadawac priorytety? Doszedlem do wniosku, jako ze wywolanie niektorych filtrow zalezy bezposrednio od wartosci wykonania i stworzenia danych za posrednictwem innego filtra, to trzeba je w jakis sposob zsynchronizowac. Ale czy to jest dobre rozwiazanie, a moze ja sie po calosci myle? Moze Filtry maja byc niezalezne (ale wtedy nie moglbym osiagnac tego czego oczekuje) .

Moglby ktos to skomentowac/wytlumaczyc (filtry "po" i zwiazki miedzy nimi) ?


--------------------
TESTWIEDZY.PL - Przetestuj swoją wiedzę...

Nie ma rzeczy niemożliwych. Niemożliwe wymaga jedynie więcej czasu...
Pracujemy na Ciebie! - MINDFLOW.PL
Go to the top of the page
+Quote Post
sf
post 20.06.2006, 05:21:47
Post #2





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

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


IMO :
- filtry powinny być niezależne od siebie, ale korzystać z context ( request, response, ja mam jeszcze configuration oraz currentUser )
- jeśli chodzi o kolejność wywoływania to u mnie jest to dość proste rozwiązanie, który pierwszy dodam ten pierwszy się wykonuje
- można wiele rzeczy dodać do filtrów, np. benchmark, banowanie, start sesji ( czasem nie wystarczy samo session_start(), ale zależność od session_id()), osobiście posunołem się dalej i zrobiłem także zamyaknie połączeń z bazą danych oraz DispacherFilter ( przed wysłaniem do użytkownika headera zamykam połączenie z bazą danych )


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
Ludvik
post 20.06.2006, 08:00:09
Post #3





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Filtry służą do modyfikacji żądania, które nie zawsze może być spełnione. W zasadzie cały łańcuch wykonania powinien wyglądać w uproszczeniu tak:

żądanie użytkownika -> utworzenie kontekstu (dispatcher) -> pre-filtry -> łańcuch akcji -> post-filtry -> zwrócenie odpowiedzi na żądanie

Filtrowanie przed łańcuchem akcji służy najczęściej przygotowaniu bibliotek oraz sprawdzaniu czy akcja może zostać wykonana w danym kontekście (uprawnienia użytkownika itp.).

Po łańcuchu akcji możemy pozamykać wszystkie połączenia, a także zająć się obróbką danych wyjściowych. Osobiście traktuję w swoich projektach widok jako post-filtr.

Nie powinieneś wiązać ze sobą filtrów. Priorytety - zależy jak je rozumiesz. Najprostszym rozwiązaniem jest kolejka.


--------------------
Go to the top of the page
+Quote Post
Pucy
post 20.06.2006, 11:17:00
Post #4





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 8.05.2006

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


Myslac o priorytetach chodzi mi bardziej o okreslenie kolejnosci wykonania. Jezeli chodzi o zamykanie polaczenia z baza, to robie to odrazu po wykonaniu zapytania. Bo to jest chyba bardziej efektywne niz trzymanie otwartego polaczenia.

Cytat
Nie powinieneś wiązać ze sobą filtrów.
No tak, top nie bylo by problemow. Ale gdy mam filtr ladujacy configuracje aplikacji, kolejny, ustawia costam, a nastepny sprawdza dostep uzytkownika korzystajac przy tym z configuracji ktory zaladowal 1 filtr. I teraz problem pojawilby sie w momencie gdy w katalogu te pliki byly by inaczej ustawione (data modyfikacji itd) tak wiec zastosowanie priorytetu (kolejnosci wywolania byloby ok) tylko te slowa... zeby ich nei wiazac. To kiedy w takim razie powinienem zaladowac configi a kiedy uwierzytelnic i sprawdzic dostep uzytkownika, a kiedy inne pre.akcje

Moze nie dotarlem do takiego problemu zeby sie zaglebic w zastosowanie pre.filtorw. Ale jezeli baze zamykam po swojemu,a widok odpalam standardowo poprzez akcje, to nie widze dalej konkretnych zastosowan. Moglby sprobowac mi ktos przyblizyc jeszcze pare?

Ten post edytował Pucy 20.06.2006, 11:22:02


--------------------
TESTWIEDZY.PL - Przetestuj swoją wiedzę...

Nie ma rzeczy niemożliwych. Niemożliwe wymaga jedynie więcej czasu...
Pracujemy na Ciebie! - MINDFLOW.PL
Go to the top of the page
+Quote Post
Ludvik
post 20.06.2006, 12:51:58
Post #5





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Wszystko musisz robić po kolei, dlatego zasugerowałem moje rozwiązanie - kolejkę. Wiązania ze sobą, rozumiałem raczej przez usunięcie zależności pomiędzy klasami filtrów. Co do działania, to jeden filtr może opierać się na efektach działania poprzedniego.

Nie wiem czy trzymanie otwartego połączenia ma jakiś większy wpływ na wydajność aplikacji.

Nikt nie każe używać filtrów. Jak każdy wzorzec, został stworzony, aby zwiększyć elastyczność aplikacji. To jest dyskusja w stylu programowanie proceduralne vs. obiektowe. Wszystko można napisać proceduralnie, tylko czy później będzie Ci wygodniej nad tym pracować... Jeżeli umiesz to porządnie wykonać bez filtrów, to nie widzę przeszkód w pominięciu tego wzorca.


--------------------
Go to the top of the page
+Quote Post
Pucy
post 20.06.2006, 13:37:28
Post #6





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 8.05.2006

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


Dlatego moze wlsnie chcialem rozwinac troche ta dyskusje o programowaniu proc vs obkt. Bo moze ja nie widzie pewnych zastosowan, i dlatego chcialbym zebysmy sprobowali rozwinac ten problem, jezeli nie bylo to poruszane na forum juz w dosc obszerny sposob.

Ah, Ludvik to musielismy sie zle zrozumiec, bo mi nie chodzilo o zaleznosci typu ze jeden korzysta z drugiego czy cos, tylko wlasnie o wyniki dzialania jednego a kolejne korzystaja z tych wynikow, ale jak wlasnie piszesz potrzebna jest kolejka (u mnie priorytety).


--------------------
TESTWIEDZY.PL - Przetestuj swoją wiedzę...

Nie ma rzeczy niemożliwych. Niemożliwe wymaga jedynie więcej czasu...
Pracujemy na Ciebie! - MINDFLOW.PL
Go to the top of the page
+Quote Post
Ludvik
post 20.06.2006, 14:00:27
Post #7





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Dyskusja była poruszana, ale nie rozwinęła się za bardzo.

Może powiesz, jak u Ciebie wygląda:
- utworzenie połączenia z bazą
- autentykacja, autoryzacja
- wybór widoku (nie chodzi o szablon, tylko o sposób wyświetlania - np. html, xml, rss)

Najprawdopodobniej robisz to w kontrolerze i akcjach. Przy zastosowaniu tego wzorca sam kontroler nie interesuje się, co robią filtry, w związku z czym nie ma potrzeby grzebania w jego kodzie. Jeżeli inicjujesz i zamykasz połączenie z bazą (lub robisz coś innego) w akcjach, to zamykasz sobie drogę do wymiany sterownika bazy bez modyfikowania kodu akcji. Akcje powinny operować na danych, a nie zajmować się rutynowymi czynnościami, takimi jak te, które przed chwilą wymieniłem.


--------------------
Go to the top of the page
+Quote Post
Pucy
post 20.06.2006, 14:37:25
Post #8





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 8.05.2006

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


Moje polaczenie z baza polega na utworzeniu obiektu i stworzeniu polaczenia , wykonaniu zapytania i autmatycznemu zamknieciu polaczenia. Nie ma nic wspolnego z kontrolerem, a jedynie z modelami ktore poberaja dane i je przetwarzaja.

Autoryzacja pobiera config (no wlasnie sie zastanawiam, narazie jest na sztywno, ale chce walnac go co filtra ladujacego configi)
  1. <?php
  2. class pre_login {
  3.  
  4. var $oDebug;
  5. var $oConfigs;
  6.  
  7.  function run($oAction) {
  8.  
  9. $this->oDebug =& Debugger::getInstance();
  10. $this->oConfigs =& Configs::getInstance();
  11.  
  12. $Logged =& userLogin::getInstance();
  13.  
  14. if ((!$Logged->isLogged() AND $oAction->oGet->getParam(1)!='login') OR 
  15. ($Logged->oAccess->access<=0 AND $oAction->oGet->getParam(1)!='login')) {
  16.  
  17. header("Location: ".MAIN_DIR."panel.php?login");
  18.  
  19. } elseif ($oAction->oGet->getParam(1)!='login') {
  20.  
  21. $oAction->oView->assign('user',$_COOKIE['login']);
  22. $oAction->oView->assign('access',$Logged->oAccess);
  23.  
  24. $Logged->login($_COOKIE['login']);
  25.  
  26. }
  27. }
  28.  
  29. }
  30. ?>


A wyswietlanie za pomoca SMARTY (html), przekazuje nazwe widoku i po prostu odpalam.

No i ostatecznie zgodze sie z Toba. I racja jest ze kontroler nie interesuje sie filtrami, jak pisalem wyzej , wg mnie one maja przygotowac jedynie, dane potrzebne do analizy przed wykonaiem akcji. Jeszcze to idzie dosc prosto zrozumiec, lecz problem pojawia sie w zastosowaniach after.filtrow? Bo co jak co, ciezko mi sie doszukac jakiegos konkretnego zastosowania (no oprocz tworzenia widoki, jak napisane bylo wyzej)


--------------------
TESTWIEDZY.PL - Przetestuj swoją wiedzę...

Nie ma rzeczy niemożliwych. Niemożliwe wymaga jedynie więcej czasu...
Pracujemy na Ciebie! - MINDFLOW.PL
Go to the top of the page
+Quote Post
ActivePlayer
post 20.06.2006, 14:50:12
Post #9





Grupa: Przyjaciele php.pl
Postów: 1 224
Pomógł: 40
Dołączył: 6.07.2004
Skąd: Wuppertal

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


Cytat
Moje polaczenie z baza polega na utworzeniu obiektu i stworzeniu polaczenia , wykonaniu zapytania i autmatycznemu zamknieciu polaczenia. Nie ma nic wspolnego z kontrolerem, a jedynie z modelami ktore poberaja dane i je przetwarzaja.

Czyli przy 5 zapytaniach 5 razy się łączysz i 5 razy robisz close? przeciez nawiązanie połączenia zajmuje najwięcej czasu
Go to the top of the page
+Quote Post
Ludvik
post 20.06.2006, 16:30:06
Post #10





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Mogę Ci podać przykład, który od dawna chodzi mi po głowie - cache. Zapis do cache odbywa się w post-filtrze, a odczyt w pre-filtrze. Zastosowań jest wiele, niekoniecznie są one zawsze potrzebne.


--------------------
Go to the top of the page
+Quote Post
Pucy
post 20.06.2006, 17:48:58
Post #11





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 8.05.2006

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


Ludvik pomysle, narazie zrobilem jedynie cache zapytan do bazy ale to tak zostawie i nie sa one w filtrach. Ale rozmyslam nad cachowaiem klas i reszty porzebnych plikow alpikacji do includowania.

ActivePlayer, no wlasnei mnie zagiales. winksmiley.jpg Jakis czas temu czytalem taka madra ksiazke i tak mi sie cos ubzduralo ze widzialem wlasnie takie podejscie do funkcji mysql_close() jak uzylem u siebie, i nie wiem czy mi sie to przewidzialo (ale raczej nie, bo jakos wpadlo mi to do glowy) I moze chodzi oto ze utrzymujac polaczenie z baza przez czas trwania calego skryptu zuzywamy zasoby servera php, a laczenie i rozlaczanie natychmiastowe wykorzystuje to tylko wtedy gdy jest to potrzebne. Nie jestem tego pewnien. A z drugiej strony w takim badz razie po co stosowac mysql_close() jezeli polaczenie i tak zostanie zamkniete na koniec skryptu, nawet jezeli polaczenia sa wielokrotne.


--------------------
TESTWIEDZY.PL - Przetestuj swoją wiedzę...

Nie ma rzeczy niemożliwych. Niemożliwe wymaga jedynie więcej czasu...
Pracujemy na Ciebie! - MINDFLOW.PL
Go to the top of the page
+Quote Post

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: 15.07.2025 - 04:49