Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][SF3], Voters
nospor
post 5.01.2017, 11:03:43
Post #1





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
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?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
ohm
post 5.01.2017, 11:15:43
Post #2





Grupa: Zarejestrowani
Postów: 618
Pomógł: 143
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 5.01.2017, 11:27:48
Post #3





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
nospor
post 5.01.2017, 12:05:56
Post #4





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
destroyerr
post 5.01.2017, 13:12:51
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 5.01.2017, 13:23:10
Post #6





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
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 wink.gif



--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
skowron-line
post 5.01.2017, 15:08:08
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.


smile.gif Symfony stoi w przeciwieństwie do tego stwierdzenia


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
destroyerr
post 5.01.2017, 15:56:53
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 5.01.2017, 17:07:59
Post #9





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
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 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 wink.gif

Cytat
Symfony stoi w przeciwieństwie do tego stwierdzenia
A jak stoi do tego Laravel?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
destroyerr
post 6.01.2017, 11:45:31
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 6.01.2017, 12:12:33
Post #11





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
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 smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
kpt_lucek
post 10.01.2017, 04:55:29
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 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ł smile.gif



--------------------


Cytat
There is a Bundle for that
Lukas Kahwe Smith - October 31th, 2014
Go to the top of the page
+Quote Post
nospor
post 10.01.2017, 10:09:49
Post #13





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
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 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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
kpt_lucek
post 10.01.2017, 10:29:23
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.


--------------------


Cytat
There is a Bundle for that
Lukas Kahwe Smith - October 31th, 2014
Go to the top of the page
+Quote Post
nospor
post 10.01.2017, 10:57:41
Post #15





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
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 smile.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
pyro
post 10.01.2017, 11:46:44
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


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
nospor
post 10.01.2017, 12:21:07
Post #17





Grupa: Moderatorzy
Postów: 36 441
Pomógł: 6290
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 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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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: 16.04.2024 - 13:16