Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MVC] Indywidualne, globalne zmienne w szablonie, nick zalogowanego
markonix
post
Post #1





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Nie mam pomysłu gdzie umieścić dane globalne indywidualne dla zalogowanego użytkownika.
W dużym uproszczeniu chodzi np. o nick. Oczywiście można pakować w sesje ale powiedzmy, że tych danych jest więcej i mogą się zmieniać.

Zmienna ta jest globalna, jest w każdym widoku (w nagłówku, header) i na pewno nie widzi mi się, aby każdorazowo w każdym kontrolerze i jego akcji wysyłać "ręcznie" tą zmienną do widoku.

Jedyne co mi przychodzi do głowy to helper ale czy wolno w nim operować na modelu (model user, wykonanie zapytania, zwrócenie pożądanych danych)?

Ten post edytował markonix 15.04.2012, 11:03:37


--------------------
Go to the top of the page
+Quote Post
tolomei
post
Post #2





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

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


Może coś w stronę wzorca Registry?


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
markonix
post
Post #3





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Klasę registry mam do przechowywania globalnego chyba że mówimy o całkowicie innej filozofii.
Jeżeli chodzi o klasę to gdzie by wypadało zrobić te przypisanie? W bootstrap?


--------------------
Go to the top of the page
+Quote Post
tolomei
post
Post #4





Grupa: Zarejestrowani
Postów: 450
Pomógł: 135
Dołączył: 18.11.2010
Skąd: Wschowa

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


Chcesz przechowywać globalne dane indywidualne dla każdego użytkownika. Jak nic nasuwa się tutaj sesja.
Dane mogą się zmieniać - nie widzę problemów.
Napisz sobie jakąś dobrą klasę dostępu do tych danych i bazuj na sesji w wydzielonej przestrzeni nazw.

Takie moje zdanie - może ktoś inny coś zaproponuje.


--------------------
“ Computers are good at following instructions, but not at reading your mind. ”
- Donald Knuth
Go to the top of the page
+Quote Post
markonix
post
Post #5





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


No to może troszkę na przeciw sesjom.
Jakiś box z statystykami użytkownika, które się zmieniają praktycznie są chwile gdy wykona jakąś akcje.
Tutaj sesje byłby totalnie nieprzydatne chyba, że bym je aktualizował przy każdej zmianie, a sesje jak dla mnie powinny być tylko przy logowaniu inicjowane.


--------------------
Go to the top of the page
+Quote Post
Orzeszekk
post
Post #6





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

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


Dziwny problem. Robisz sobie kontroler common ktory wywolujesz z widoku i ktory zwraca ci dane potrzebne do wyswietlenia nicku uzytkownika. z tego co pamietam to w asp.net i w symfony 1/2 mozna wywolywac akcje z poziomu widoku. A jak sie nie da to robisz helper ktory odpytuje ten kontroler albo od razu model, i zwraca dane ktore dalej sobie wyswietlasz w layoucie jak ci sie zywnie podoba.

w asp.net mvc jest cos takiego jak ViewBag - jest to globalny slownik ktory jest dostepny we wszystkich widokach uzytych do zrenderowania odpowiedzi dla danego requesta. Mozna sobie wczytac jakies dane akcją lub partial akcją, wrzucic to do viewBaga i nastepnie skorzystac z tego w innym widoku. moze tez sobie zaimplementuj cos takiego.

helper nie musi operowac na modelu - wystarczy ze wywola akcje kontrolera ktora mu dostarczy paczke danych. w koncu to kontroler jest od zlepiania modeli i widokow.

sorki ze podaje przyklad z innego jezyka ale teraz glownie na nim siedze a mvc niezaleznie od języka jest podobne wiec chodzi o samą idęę.

Ten post edytował Orzeszekk 15.04.2012, 12:23:16


--------------------
"The first 90 percent of the code accounts for the first 90 percent of the development time. The remaining 10 percent of the code accounts for the other 90 percent of the development time."
Tom Cargill, Bell Labs
Go to the top of the page
+Quote Post
markonix
post
Post #7





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Chyba zrobię helper z odwołaniem do modelu user, będzie najprościej.


--------------------
Go to the top of the page
+Quote Post
Pilsener
post
Post #8





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


Ja do personalizacji aplikacji polecam ciacha - przykład: zapisujesz informacje w co user klika i na tej podstawie generujesz mu np. menu podręczne jego ulubionych działów. Żeby coś takiego zrobić w bazie to raz - trzeba się napocić a dwa - po co obciążać bazę i parser? A gdy user ciacho zgubi czy zje to nic się nie dzieje.
Go to the top of the page
+Quote Post
Fifi209
post
Post #9





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(markonix @ 15.04.2012, 12:27:06 ) *
Tutaj sesje byłby totalnie nieprzydatne chyba, że bym je aktualizował przy każdej zmianie, a sesje jak dla mnie powinny być tylko przy logowaniu inicjowane.

A jak są zrobione np. koszyki w sklepach internetowych?

Użytkownik klika, dodaje do koszyka (do sesji), strona się przeładowuje i robi tak ciągle, póki nie zadecyduje zrezygnować z czegoś lub zapłacić.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
viking
post
Post #10





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Przykład jak można zrobić: http://framework.zend.com/manual/en/zend.auth.html


--------------------
Go to the top of the page
+Quote Post
by_ikar
post
Post #11





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


A czy nie prościej mieć dostęp do obiektu bezpośrednio z szablonu? W symfony masz coś takiego jak $app i z jego poziomu masz dostęp do obiektów, chociażby takich jak request. I nie widzę przeciwieństw aby i taki dostęp mieć w przypadku obiektu użytkownika wink.gif
Go to the top of the page
+Quote Post
markonix
post
Post #12





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Cytat(Pilsener @ 15.04.2012, 22:59:53 ) *
Ja do personalizacji aplikacji polecam ciacha - przykład: zapisujesz informacje w co user klika i na tej podstawie generujesz mu np. menu podręczne jego ulubionych działów. Żeby coś takiego zrobić w bazie to raz - trzeba się napocić a dwa - po co obciążać bazę i parser? A gdy user ciacho zgubi czy zje to nic się nie dzieje.


Cytat(Fifi209 @ 16.04.2012, 01:28:21 ) *
A jak są zrobione np. koszyki w sklepach internetowych?

Użytkownik klika, dodaje do koszyka (do sesji), strona się przeładowuje i robi tak ciągle, póki nie zadecyduje zrezygnować z czegoś lub zapłacić.


Wspomniałem, że chodzi o bazodanowe dane typu: imię, stan konta, jakieś alerty itp.
Nie widzę tu miejsca dla ciasteczek, które oczywiście wykorzystuje, nawet dokładnie tak jak piszesz, do obsługi menu.

Sesje musiałbym aktualizować przy każdej zmianie np. transakcji. Uważam, że ten pomysł jest zupełnie nietrafiony przy celu, o którym wspominam.

Ten post edytował markonix 16.04.2012, 11:28:18


--------------------
Go to the top of the page
+Quote Post
tehaha
post
Post #13





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


Sesja się tutaj właśnie idealnie nadaje, zwłaszcza, że część danych zostanie pobrana tylko raz i już się nie zmienią. Przecież w przypadku zmiany nie aktualizujesz całej sesji, a jedynie to co jest Ci potrzebne, czyli w tym przypadku możesz tylko dorzucić do tablicy transakcji dodatkową pozycję lub ją zaktualizować. Możesz sobie ładnie wszystko wrzucić do wielowymiarowej tablicy i trzymać to w sesji

  1. $_SESSION['data'] = array
  2. (
  3. 'userData' => array
  4. (
  5. 'name'=>'Jan',
  6. 'surname'=>'Kowalski'
  7. ),
  8. 'accountData'=>array
  9. (
  10. 'amount'=>34,54,
  11. 'currency'=>'PLN',
  12. 'lastTrans'=>'2012-04012 14:54:00'
  13. ),
  14. 'notifications' => array
  15. (
  16. array('type'=>'error', 'msg'=>'treść...'),
  17. array('type'=>'error', 'msg'=>'treść...'),
  18. )
  19. );


Uwierz sesja nie służy tylko i wyłącznie do przechowywania tam jednej zmiennej $_SESSION['userLogged'] = 1, i jest bardzo wygodna jeśli chodzi o takie personalne dane pobierane tylko jeden raz, dane tymczasowe, komunikaty systemowe itd.
Go to the top of the page
+Quote Post
markonix
post
Post #14





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


No ale wracając do modelu MVC to powiedzmy, że mam model użytkownika czy tam model transakcji.
I teraz przy metodzie "updateAccount($amount)" musiałbym oprócz aktualizacji w bazie dokonać aktualizacji sesji.
Nie wiem.. Jak ja bym takie coś zobaczył w cudzej aplikacji to bym się mocno zdziwił, nigdy nie widziałem takiej metody.

Zawsze uczono mnie (głównie te forum), że należy ograniczać ilość danych przechowywanych w sesji.
Dlatego też zawsze się tego trzymałem - nawet nie przechowuje typu konta (admin i nie admin) w sesji ale sprawdzam po ID zalogowanego czy ma admina..


--------------------
Go to the top of the page
+Quote Post
tehaha
post
Post #15





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


Cytat
Zawsze uczono mnie (głównie te forum), że należy ograniczać ilość danych przechowywanych w sesji.
Dlatego też zawsze się tego trzymałem - nawet nie przechowuje typu konta (admin i nie admin) w sesji ale sprawdzam po ID zalogowanego czy ma admina..

Jesteś w stanie podać mi jakiś rozsądny argument stojący za tym, żeby nic nie trzymać w sesji? Czy mam rozumieć, że jak chcesz zrobić coś tak banalnego jak "Witaj, użytkownik" to przy każdym odświeżeniu strony pobierasz to z bazy i wykonujesz zbędę zapytania? Poza tym warto zdefiniować tą "ilość danych", przecież taka tablica to może będzie 5KB danych, nie mówimy tu o jakichś szalonych pomysłach przechowywania w sesji zrzutu całej tabeli tylko o kilkudziesięciu linijkach a to tyle co nic. Sesje są bardzo przydatne w nie których przypadkach i warto je używać i jak dla mnie to jest właśnie jeden z takich przypadków. Z kwestii bezpieczeństwa nie przechowuje się w sesji żadnych haseł, ale inne dane to już spokojnie można.

Cytat
musiałbym oprócz aktualizacji w bazie dokonać aktualizacji sesji.
Nie wiem.. Jak ja bym takie coś zobaczył w cudzej aplikacji to bym się mocno zdziwił, nigdy nie widziałem takiej metody.
Nigdy nie widziałeś, żeby obiekt w swojej metodzie wywołał metodę innego obiektu?

Odwołując się jeszcze do jednego z Twoich poprzednich postów to to czy dane warto trzymać w sesji, zależy jeszcze od tego jak często będą aktualizowane - sesje świetnie się nadają do danych: spersonalizowanych, tymczasowych i obowiązujących w trakcie jednej sesji użytkownika. Ale np. do statystyk to już nie za bardzo, chyba, że są to takie statystyki, które nie zmienią się w czasie odwiedzin.
Go to the top of the page
+Quote Post
viking
post
Post #16





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


Chyba mylisz pojęcia. Warto ograniczyć ilość danych po stronie klienta (choćby ze względu na rozmiar cookie 4kB i bezpieczeństwo takich danych). Ja osobiście trzymam wyłącznie ID sesji i nigdy więcej. Natomiast to jest Twój łącznik "stanowości". Po stronie serwera masz kontener z danymi zapisanymi w sesji.


--------------------
Go to the top of the page
+Quote Post
tehaha
post
Post #17





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


Cytat
Chyba mylisz pojęcia. Warto ograniczyć ilość danych po stronie klienta (choćby ze względu na rozmiar cookie 4kB i bezpieczeństwo takich danych). Ja osobiście trzymam wyłącznie ID sesji i nigdy więcej. Natomiast to jest Twój łącznik "stanowości". Po stronie serwera masz kontener z danymi zapisanymi w sesji.
Szczerze mówiąc to nie zrozumiałem Twojej odpowiedzi, sesja nie trzyma danych po stronie użytkownika tylko w pliku na serwerze, użytkownik ma tylko ID sesji.

Ten post edytował tehaha 18.04.2012, 10:53:12
Go to the top of the page
+Quote Post
viking
post
Post #18





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


To była odpowiedź do postu markonix smile.gif


--------------------
Go to the top of the page
+Quote Post
markonix
post
Post #19





Grupa: Zarejestrowani
Postów: 2 707
Pomógł: 290
Dołączył: 16.12.2008
Skąd: Śląsk

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


Sesja trzyma dane tam gdzie tego sobie życzymy, sesja wbudowana w PHP jak i własny mechanizm sesji.
Dlatego nie można tak ślepo myśleć, że trzymanie w sesji odciąża aplikację bo odczytanie z niej wartości to jest normalna operacja na pliku bądź zapytanie (oczywiście szybsze niż zwykłe bo zwykle trzyma się sesje w polach MEMORY).


--------------------
Go to the top of the page
+Quote Post
tehaha
post
Post #20





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

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


Cytat
Dlatego nie można tak ślepo myśleć, że trzymanie w sesji odciąża aplikację bo odczytanie z niej wartości to jest normalna operacja na pliku bądź zapytanie
Tu nie o chodzi o to czy to odczyt pliku czy zapytanie do bazy (bo różnica jest w bezpieczeństwie i wygodzie obsługi a nie szybkości, bo przy takiej małej ilość danych to bez różnicy), tylko chodzi o ilość tych operacji, jeżeli będziesz do każdej byle informacji, która i tak się nie zmienia tworzył oddzielne zapytanie do bazy przy każdym odświeżeniu strony to generujesz sobie większe obciążenie niż jest to konieczne.
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 Aktualny czas: 19.08.2025 - 13:14