Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony]Entity jako service?
mundeck
post
Post #1





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 2.09.2012

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


Czy istnieje jakieś przeciwskazanie, aby klasę User rejestrować jako service? Chodzi o to, że ustawiam w niej role użytkownika na podstawie różnych parametrów i niewielkich algroytmów. Dotychczas były to parametry zapisywane w bazie, w tabeli User, natomiast teraz chcę nadać rolę na podstawie parametru zapisywanego w configu, a żeby się do niego dostać, potrzebowałbym wstrzyknąć - sam jeszcze nie wiem co, ale choćby np. cały container. Ale czy to jest zalecane rozwiązanie?
Go to the top of the page
+Quote Post
rad11
post
Post #2





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


A takie coś nie może być ? http://stackoverflow.com/questions/1033070...e-inside-entity
Go to the top of the page
+Quote Post
mundeck
post
Post #3





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 2.09.2012

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


Ale to wtedy za każdym razem musiałbym nadawać rolę w miejscu, w którym jest ona sprawdzana. Więc równie dobrze mógłbym jej nie nadawać, tylko osobno sprawdzić warunki jej przydzielania i na tym poprzestać.
Go to the top of the page
+Quote Post
lukaskolista
post
Post #4





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Encja zdecydowanie nie powinna być usługą. Jeżeli opisane rpzez Ciebie "algorytmy" masz w encji, to utwórz nową usługę i tam je umieść, a encje zostaw w spokoju. Encje są w warstwie data persistance i tam powinny pozostać.
Go to the top of the page
+Quote Post
Puszy
post
Post #5





Grupa: Zarejestrowani
Postów: 279
Pomógł: 42
Dołączył: 10.10.2011

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


Tak trochę może offtopowo bo w Symfony siedziałem chwilę ale miałem podobny problem do Twojego w ZF2, po prostu stworzyłem sobie klasę statyczną przy bootstrapie i ładuję tam wszystkie tego typu dane i funkcję pomocnicze. Dla przykładu onBootstrap ustawia mi w klasie użytkownika, kluczowe dane z configu o które często odpytuję, ustawiam też entityManagera tak że jest dostepny w każdym miejscu projektu czy też dodaję funkcje pomocnicze takie jak tworzenie sluga do tekstu czy też generowanie losowego ID o konkretnej składni.
Go to the top of the page
+Quote Post
mundeck
post
Post #6





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 2.09.2012

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


Cytat(lukaskolista @ 1.12.2016, 14:27:20 ) *
Encja zdecydowanie nie powinna być usługą. Jeżeli opisane rpzez Ciebie "algorytmy" masz w encji, to utwórz nową usługę i tam je umieść, a encje zostaw w spokoju. Encje są w warstwie data persistance i tam powinny pozostać.


Czyli wszystkie role powinny być zapisane w bazie, a nie tworzone "w locie"? Myślałem, że skoro w dokumentacji jest:

  1. public function getRoles()
  2. {
  3.  
  4. return ['ROLE_USER'];
  5. }


to można sobie tam zwracać role jakie się chce, w zależności od wartości innych pól Usera.
Go to the top of the page
+Quote Post
lukaskolista
post
Post #7





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Tak, ale jeśli chcesz użyć usługi, to już musisz to zmienić. Encja nie może korzystać z usług i tyle. Encja reprezentuje to, co zapisane jest w bazie.
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%)
-----


Cytat
Myślałem, że skoro w dokumentacji jest:
- zauważ, że musi być ta metoda, bo wymusza to interfejs.
Natomiast ten fragment kodu jest owszem, niefortunny - bo nawet jeśli coś hardkodujemy to powinniśmy to chociaż okomentować.

Można tak zrobić, jeśli każdy User ma mieć zawsze jedną i tą samą rolę - po co wtedy zapisywać to w bazie? Robi się wtedy stałą typu "USER_DEFAULT_ROLE" (albo "FIXED_ROLE") a metoda getRole zwraca tą stałą.

Jeśli natomiast rola ma się dla użytkownika zmieniać, to chyba oczywiste, że powinieneś ją przechowywać w bazie danych.

Natomiast jeśli potrzebujesz obiektu, który zawiera dane nie tylko z bazy oraz nie jest odwzwierciedleniem rekordu z tabeli bazodanowej to nie może to być encja - jednak w praktyce różnie bywa i nierzadko programiści wp.... do encji co popadnie. O tym co powinno być w encji a co nie decyduje zdrowy rozsądek - zazwyczaj drobna logika jest dopuszczalna (np. implementacja metody getFullName, która zwraca name + lastname lub inne takie).
Jednak trzeba pamiętać, że "czystej" encji oczekuje wiele komponentów (formularze, walidatory, menedżer encji etc.) i majstrując przy niej możesz wywalić pół aplikacji Lkingsmiley.png
Go to the top of the page
+Quote Post
LowiczakPL
post
Post #9





Grupa: Zarejestrowani
Postów: 531
Pomógł: 55
Dołączył: 3.01.2016
Skąd: Łowicz

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


Jak jesteśmy przy Encjach i Serwisach to mam takie pytanie. Hipotetycznie i w uproszczeniu.

Mam klasę Counter dla User, takich liczników/aktualizatorów będę miał sporo większość odpalanych przez AJAX.

Zaczynam z Symfony i nie bardzo ogarniam struktury do tej pory pisałem w MVC i miałem jedynie 3 foldery wink.gif

1. Mam zrobione: podczas rejestracji Listener nasłuchuje czy rejestracja przebiegła prawidłowo i uruchamia Kontroler z metodą Init, która zakłada dla Usera pozycję z w tabeli Counter.
2. Teraz chce przy każdym odświeżeniu strony aktualizować Counter Usera
... i mam dylemat co do nazewnictwa Folderów a raczej poprawnego przypisania tej usługi bo raczej inkrementacja Coutera to usługa co nie ?

Podpowiedzcie gdzie mam umieścić taka klasą aktualizującą Counter
1. Model/Manager
2. Service/Manager
3. a może zrobić Fabrykę dla Countera i wywołanie przez Klasę jakiegoś Listenera podczas każdego przeładowania strony wywoływane przez Twiga


--------------------
Szukam zleceń Symfony, Laravel, Back-End, Front-End, PHP, MySQL ...
Go to the top of the page
+Quote Post
lukaskolista
post
Post #10





Grupa: Zarejestrowani
Postów: 872
Pomógł: 94
Dołączył: 31.03.2010

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


Cytat
1. Mam zrobione: podczas rejestracji Listener nasłuchuje czy rejestracja przebiegła prawidłowo i uruchamia Kontroler z metodą Init, która zakłada dla Usera pozycję z w tabeli Counter.

Że co? Bardziej się nie dało utrudnić sobie życia?

Cytat
2. Teraz chce przy każdym odświeżeniu strony aktualizować Counter Usera
... i mam dylemat co do nazewnictwa Folderów a raczej poprawnego przypisania tej usługi bo raczej inkrementacja Coutera to usługa co nie ?

Czemu chcesz nazywać klasy z "Manager"?

Co do klasy, to powinna być ona usługą, jest wiele konwencji nazewnictwa, stosuj jak najbardziej naturalne nazwy, jak np. UserCounter (licznik użytkowników), chociaż pewnie nie o to Ci chodzi. Jeśli chcesz (mogę jedynie przypuszczać, bo wyraziłeś się nieprecyzyjnie) licznik odsłon serwisu przez danego usera, to nazwij taką klasę ViewsCounter (licznik odsłon) lub coś w tym rodzaju.

Cytat
3. a może zrobić Fabrykę dla Countera i wywołanie przez Klasę jakiegoś Listenera podczas każdego przeładowania strony wywoływane przez Twiga

Fabryka dla Countera... wywoływane przez listenera i twiga... współczuję utrzymania takiego rozwiązania.

Ten post edytował lukaskolista 8.12.2016, 21:58:14
Go to the top of the page
+Quote Post
LowiczakPL
post
Post #11





Grupa: Zarejestrowani
Postów: 531
Pomógł: 55
Dołączył: 3.01.2016
Skąd: Łowicz

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


na razie4 specyzuję tylko pkt 1.

Korzystam z FOSa a on defaultowo przekierowuje mnie na index więc muszę mieć listenera aby przechwycić poprawnie zalogowanie i przekierować na swój routing, ale może da radę to zrobić inaczej?


--------------------
Szukam zleceń Symfony, Laravel, Back-End, Front-End, PHP, MySQL ...
Go to the top of the page
+Quote Post
Boshi
post
Post #12





Grupa: Zarejestrowani
Postów: 342
Pomógł: 15
Dołączył: 30.08.2011

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


@Lowiczak

http://stackoverflow.com/questions/1878338...after-logged-in

nie musisz mieć żadnych listinerów.. zrozumiałem że po zalogowaniu ma cię gdzieś przekierować?
Go to the top of the page
+Quote Post
Pilsener
post
Post #13





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

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


Cytat
ale może da radę to zrobić inaczej
- oczywiście, podstawowym Twoim problemem jest, że jak przypuszczam, użyłeś jakiegoś bundla z konkretną implementacją, natomiast potrzebujesz implementacji szczególnej. Dlatego zamiast coś instalować po czym natychmiast kombinować jak to obejść, powinieneś po prostu zaimplementować logowanie po swojemu.
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%)
-----


Ewentualnie zrobić to na Voter'ach, definiować swoje uprawnienia i w nich je sprawdzać dokładnie tak, jak ma to miejsce w przypadku roli.

  1. //controller
  2. $this->isGranted('ROLE_ADMIN');


A tak jakiś custom:

  1. //controller
  2. $this->isGranted(MojVoter::MOJE_SUPER_UPRAWNIENIE, $this->getUser());


I wtedy Voter wygląda tak:

  1.  
  2. <?php
  3.  
  4. namespace MojBundle\Security\Voter;
  5.  
  6. use Doctrine\ORM\EntityManager;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\Authorization\Voter\Voter;
  9.  
  10. /**
  11.  * Class MojVoter
  12.  */
  13. class MojVoter extends Voter
  14. {
  15. const MOJE_SUPER_UPRAWNIENIE = 'MOJE_SUPER_UPRAWNIENIE';
  16.  
  17. /**
  18. * Determines if the attribute and subject are supported by this voter.
  19. *
  20. * @param string $attribute An attribute
  21. * @param mixed $subject The subject to secure, e.g. an object the user wants to access or any other PHP type
  22. *
  23. * @return bool True if the attribute and subject are supported, false otherwise
  24. */
  25. protected function supports($attribute, $subject)
  26. {
  27. if (self::MOJE_SUPER_UPRAWNIENIE !== $attribute) {
  28. return false;
  29. }
  30.  
  31. return $subject instanceof UserInterface; // Lub co tam sobie chcesz
  32. }
  33.  
  34. /**
  35. * Perform a single access check operation on a given attribute, subject and token.
  36. * It is safe to assume that $attribute and $subject already passed the "supports()" method check.
  37. *
  38. * @param string $attribute
  39. * @param mixed $subject
  40. * @param TokenInterface $token
  41. *
  42. * @return bool
  43. */
  44. protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
  45. {
  46. //Twoja logika która określa czy masz uprawnienie, zwracasz (boolean)
  47. }
  48. }


Ten post edytował kpt_lucek 12.12.2016, 14:27:12


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


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





Grupa: Zarejestrowani
Postów: 531
Pomógł: 55
Dołączył: 3.01.2016
Skąd: Łowicz

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


Dzięki za info, jestem mądrzejszy o kilka postów wink.gif, przekierowanie zrobiłem w configu co do fabryki to jednak jeszcze nie dorosłem do tematu.

Na razie mam tylko kilka serwisów. Co do Voter przyda się bo aktualnie wziąłem się za uprawnienia.


--------------------
Szukam zleceń Symfony, Laravel, Back-End, Front-End, PHP, MySQL ...
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: 21.08.2025 - 12:42