Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][SF3], Voters
nospor
post
Post #1





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Hejka, zalozmy ze mam 20 roznych Entity. Dla kazdej Entity chce stworzyc Voter by zarzadzac co kto moze kasowac/edytowac/itp.
Tak wiec tworze 20 voters, rejestruje je jako service.Wszystko dziala wysmienicie ale jest jedno ale. Symfony tworzy wszystkie 20 obiektow voters dla kazdego request, nie wazne czy ja zamierzam z nich korzystac czy nie. Poczytalem troche, ok, rozumiem czemu.
Nie mniej jednak nie podoba mi sie, iz za kazdym razem tworzy mi te 20 obiektow nawet jak nie potrzebuje ani jednego z nich. Oczywiscie moge latwo ograniczyc, by one nic nie sprawdzaly jak nie ma potrzeby wiec nie beda mi obciazac aplikacji zbednymi wyliczeniami ale sam fakt, ze sa one tworzone bez sensu mnie irytuje.

No i pytanie: czy powinieniem sie poprostu nie irytowac i olac to i zostawic jak jest czy moze powininiem cos zrobic?
Przykladowo mysle nad takim rozwiazaniem, ze tworze i rejestruje tylko jeden uniwersalny voter dla wszystkich Entity i w przypadku gdy bedzie żądanie sprawdzenia praw dla jakiejs Entity to dopiero wtedy bede ladowal wlasciwy voter dla tej entity jako zwykly niezarejestrowany obiekt.

Jak wy to robicie u siebie?
Go to the top of the page
+Quote Post
ohm
post
Post #2





Grupa: Zarejestrowani
Postów: 623
Pomógł: 144
Dołączył: 22.12.2010

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


A nie myślałeś nad użyciem/przetestowaniem takiego: https://symfony.com/doc/current/service_con...y_services.html ?
Go to the top of the page
+Quote Post
nospor
post
Post #3





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




To nie zadziala w przypadku voters, gdyz dla nich mechanizm jest taki, ze symfony laduje wszystkie voters jakie sa by moc realizowac swoja wewnetrzna polityke.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




To samo zaproponowal poprzednik.
Ale zrozumcie, ze symfony w przypadku voters ma taki mechanim ze laduje je wszystkie bo musi ladowac by realizowac swoje cele. Symfony nie wie jaki voter bede potrzebowal. Symfony laduje wszystkie voter i to votery wiedza czy maja obslugiwac dana akcje czy nie. Dlatego nie da sie tu uzyc LAZY service
Go to the top of the page
+Quote Post
destroyerr
post
Post #5





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Cytat
Jak wy to robicie u siebie?

Mnie to nie irytuje, ten mechanizm jak dla mnie jest ok. Zastanów się czy nie możesz w takim wypadku stworzyć bardziej ogólnego votera.
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Zastanów się czy nie możesz w takim wypadku stworzyć bardziej ogólnego votera.
Moglbym, ale wowczas trace te przejrzystosc: Jedno Entity -> Jeden Voter do zarzadzania

Cytat
Mnie to nie irytuje, ten mechanizm jak dla mnie jest ok.
Ja po prostu strasznie nie lubie tworzyc obiektow, ktorych nie bede uzywal. Ja wiem, ze te kolejne "20" obiektow to cale nic w porownaniu do tego ile Symfony tworzy obiektow po drodze nie mniej mnie to irytuje bo to kolejne "20" obiektow tworzonych na daremno (IMG:style_emoticons/default/wink.gif)

Go to the top of the page
+Quote Post
skowron-line
post
Post #7





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Cytat(nospor @ 5.01.2017, 13:23:10 ) *
Ja po prostu strasznie nie lubie tworzyc obiektow, ktorych nie bede uzywal.


(IMG:style_emoticons/default/smile.gif) Symfony stoi w przeciwieństwie do tego stwierdzenia
Go to the top of the page
+Quote Post
destroyerr
post
Post #8





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Cytat
Moglbym, ale wowczas trace te przejrzystosc: Jedno Entity -> Jeden Voter do zarzadzania

Nie wiem jak wygląda Twój kod, ale jak to ma się do zasady DRY?
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
ale jak to ma się do zasady DRY?
Czemu uwazasz ze bede sie powtarzal?
Dla jednej Entity moge miec jedna zasade a dla innej inna.
A dla tych dla ktorych bede mial te same zasady mam klase bazowa (IMG:style_emoticons/default/wink.gif) Tylko jak jakas Entity bedzie sie chciala wylamac to wtedy bedzie sobie dziedziczyc po tej klasie i nadpisywac uprawnienia/meotdy ktore chce miec po swojemu.

Ja bardzo lubie DRY i staram sie byc z nim na Ty (IMG:style_emoticons/default/wink.gif)

Cytat
Symfony stoi w przeciwieństwie do tego stwierdzenia
A jak stoi do tego Laravel?
Go to the top of the page
+Quote Post
destroyerr
post
Post #10





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Może jestem w błędzie i nie masz powtórzeń w kodzie, ale votery (zakładam, że mówimy o klasach a nie obiektach) dla każdej encji budzą takie podejrzenia. Ty widzisz swój kod i jak mówisz, że nie masz powtórzeń to spoko, mogę spać spokojniej.
Go to the top of the page
+Quote Post
nospor
post
Post #11





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
ale votery (zakładam, że mówimy o klasach a nie obiektach) dla każdej encji budzą takie podejrzenia
przyklady z dokumentacji Symfony wskazuja dosc jasno, ze dla kazdej Entity ma byc oddzielny Voter, co raczej jest dosc logiczne.

Nie zmienia to jednak faktu, że mozna napisac jeden bazowy voter, z ktorego inne w razie potrzeby beda korzystac.

Ja ostatecznie zrobilem jak pisalem na poczatku: mam jeden voter na wszystkie Entity, ktore to voter realizuje ogolne sprawdzanie praw, ktore dla wielu Entity bedzie takie samo. Ten jeden voter rejestruje w services jako wlasnie voter by symfony go ladowalo.
Do tego, jesli jakas Entity bedzie wymagac wlasnych oddzielnych praw, tworze Voter specjalnie dla niej, ale nie rejestruje juz go w services jako entity. Ten jeden glowny Voter sprawdza, czy istnieje voter dla danej entity. Jak nie, to robi swoje ogolne rzeczy, jak tak, to laduje ten specjalny voter dla danej Entity i przekazuje sprawdzanie temu specjalnemu Voter. Dzieki temu mam uniwersalnosc ale i w razie potrzeby specyficznosc i mam DRY - tak wiec spij spokojnie (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
kpt_lucek
post
Post #12





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

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


A jakbyś spróbował ogać to na Interface'ach?

W praktyce, interesuje Cię czy dana encja (czy dowolny inny model - tutaj akurat na plus, bo metody możesz współdzielić o ile implementujesz Interface / extedujesz jakiś base-abstract).

Przeważnie masz dość prosty warunek, taki jak sprawdzanie czy... no nie wiem... chociażby "createdBy" to obecnie zalogowany user, ograć to Interface'em, dać voter do sprawdzania "IS_CREATOR" i weryfikować support dać na wcześniej wspomniany Interface.

Możesz też podbić priorytet przy rejestrowaniu serwisu, w praktyce nie rozwiąże to Twojego problemu, ale tyle o ile (o ile często weryfikujesz ów warunki) przyspieszysz nieco ten proces (nieco - pewnie jakieś atomowe części sekundy (IMG:style_emoticons/default/smile.gif) ).

Poza tym, w voterze możesz odpalać inne votery Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface @security.access.decision_manager - tak jakbyś kiedyś szukał (IMG:style_emoticons/default/smile.gif)

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





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Przeważnie masz dość prosty warunek, taki jak sprawdzanie czy... no nie wiem... chociażby "createdBy" to obecnie zalogowany user, ograć to Interface'em, dać voter do sprawdzania "IS_CREATOR" i weryfikować support dać na wcześniej wspomniany Interface.
Jest to tez jakies rozwiazanie. Teraz robie to sprawdzanie w ogolnym voterze. Fakt, mozna przeniesc to do entity implementujacej interfejs. Musze sie z tym przespac (IMG:style_emoticons/default/wink.gif)

Cytat
Poza tym, w voterze możesz odpalać inne votery Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface @security.access.decision_manage

Ale by to zrobic musze mu przekazac te inne votery czyli musze jest stworzyc. Nie widze sensu. Teraz w moim rozwiazaniu tworze obiekt votera jesli taki specyficzny isntieje i odpalam jego sprawdzanie. Nie widze sensu pakowac to jeszcze w ten DecisionManager skoro wszystko mam pod reka
Go to the top of the page
+Quote Post
kpt_lucek
post
Post #14





Grupa: Zarejestrowani
Postów: 428
Pomógł: 77
Dołączył: 10.07.2011
Skąd: Warszawa

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


Cytat(nospor @ 10.01.2017, 10:09:49 ) *
Ale by to zrobic musze mu przekazac te inne votery czyli musze jest stworzyc. Nie widze sensu. Teraz w moim rozwiazaniu tworze obiekt votera jesli taki specyficzny isntieje i odpalam jego sprawdzanie. Nie widze sensu pakowac to jeszcze w ten DecisionManager skoro wszystko mam pod reka


Inaczej nie sprawdzisz (logicznie) warunku, czy user jest np Adminem.

Z poziomu kontrolera, robisz to przeważnie ->isGranted('ROLE_ADMIN'). poza tym, możesz też mieć dynamiczne role, zależne od posiadanych relacji (np user w grupie ma w standardzie rolę ROLE_{NAZWA_GRUPY}) itd. itp. - do bardziej złożonych kwestii.
Go to the top of the page
+Quote Post
nospor
post
Post #15





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Inaczej nie sprawdzisz (logicznie) warunku, czy user jest np Adminem.

Ja wiem. Poprostu nie widze sensu w moim ogolnym voter inicjalizowac na nowo ten manager dla danej specyficznej entity podczasy gdy ten specyficzyny voter tak czy siak mam pod reka (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
pyro
post
Post #16





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Zawsze możesz stworzyć votera, który wywołuje tylko niezbędne votery / obiekty sprawdzające uprawnienia
Go to the top of the page
+Quote Post
nospor
post
Post #17





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Zawsze możesz stworzyć votera, który wywołuje tylko niezbędne votery / obiekty sprawdzające uprawnienia
No wlasnie tak teraz mam (IMG:style_emoticons/default/smile.gif)

Cytat
Ja ostatecznie zrobilem jak pisalem na poczatku: mam jeden voter na wszystkie Entity, ktore to voter realizuje ogolne sprawdzanie praw, ktore dla wielu Entity bedzie takie samo. Ten jeden voter rejestruje w services jako wlasnie voter by symfony go ladowalo.
Do tego, jesli jakas Entity bedzie wymagac wlasnych oddzielnych praw, tworze Voter specjalnie dla niej, ale nie rejestruje juz go w services jako entity. Ten jeden glowny Voter sprawdza, czy istnieje voter dla danej entity. Jak nie, to robi swoje ogolne rzeczy, jak tak, to laduje ten specjalny voter dla danej Entity i przekazuje sprawdzanie temu specjalnemu Voter
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: 24.08.2025 - 01:47