Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Symfony2][Symfony]Odchudzanie kontrolerów
athabus
post
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Kolejne moje pytanie z serii "jak to poprawnie zorganizować w Symfony". Otóż napotykam na problem, że przy bardziej rozbudowanej aplikacji moje kontrolery zaczynają bardzo "puchnąć". Przykład z dzisiaj - interakcje miedzy różnymi Entity.

Załóżmy, że buduję generator ćwiczeń na siłowni, którego celem jest wygenerowanie planu na dany dzień, z określonymi parametrami.

Moje Entity wyglądają tak:

- ćwiczenie - to bazowe ćwiczenia typu pompki, podciąganie na drążku etc z np. przypisanymi trudnościami w skali 1-5
- zadanie - zadanie to wykonanie pewnej ilości ćwiczeń - np. 5 pompek
- seria - grupa zadań do wykonania (czyli np. 5x pompki, 10x podciąganie) itd.
- plan - ilość serii do wykonania

I teraz załóżmy, że piszę generator, który ma wylosować taki plan, gdzie zawodnik nazbiera łącznie np 100punktów za wykonane ćwiczenia. I tu się rodzi pytanie gdzie umieścić algorytm losowania takiego planu - czyli np. mógłby on wyglądać tak:
- wybierz losowo 3 ćwiczenia -> dobierze ilość powtórzeń tak aby seria miała 25 punktów -> stwórz 4 takie serie i zapisz je jako plan na dzisiaj

Można to zrobić w kontrolerze, ale wtedy taki kontroller strasznie puchnie. W demo_app do symfony właśnie tak to robią, ale tam mają bardzo prostą aplikację, która ogranicza się do CRUD, więc logiki tam praktycznie nie ma.

Można by zrobić to w modelu, ale w teorii z tego co zrozumiałem, to model nie ma odpowiadać za logikę tylko odczyt/zapis danych, a w tym przypadku taki entity Plan musiałby odczytywać/zapisywać/analizować dane z innych Entity, czyli zaczyna się robić spaghetti code.

Gdzieś widziałem, że ktoś postulował przerzucanie wszystkiego do services i wstrzykiwanie do nich wszystkich potrzebnych rzeczy typu ObjectManager itd. Czyli przykładowo robimy services "planCwiczen" i w nim znajduje się cała logika wyboru ćwiczeń, zapisywania wszystkiego w bazie itd. a w kotrolerze mamy tylko cos w stylu $this->get('planCwiczen')->createWorkout(). Pytanie tylko czy Services były tworzone z myślą do przechowywania całej logiki aplikacji?

Jak wy sobie z tym radzicie? Gdzie trzymacie tą część kodu odpowiedzialną za algorytm działania?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
athabus
post
Post #2





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Ad1 - oczywiście skrót myślowy, mówiąc model miałem na myśli klasy Entity/Repository.

Ad2 - czyli jednak też w przypadku Symfony jesteś za użyciem Services. Wychodzi na to, że trochę źle zrozumiałem ich znaczenie w Symfony. Bardziej traktowałem je jako dostarczycieli dodatkowych usług typu obsługa kont użytkowników, mailer etc, ale nie jako nośnik całej logiki aplikacji. Chyba jednak muszę je szerzej zrozumieć.

Czyli ogólnie wg. Ciebie poprawne rozwiązanie to w przypadku Symfony stworzenie service typu "workautGenerator", wstrzyknięcie zależności typu EntityManager, zwrócenie obiektów do kontrolera, a sam kontroler decyduje o zapisie, czy innym użyciu zwróconego rezultatu. Tak to już ma dla mnie więcej sensu, bo właśnie bolało mnie to, że w zasadzie Service stawał się sam w sobie aplikacja odpowiedzialną za wszystko, a kontroller sprowadzał się do wywołania service. W takim kodzie jak wrzuciłeś wyżej jest to sensowniej rozwiązane i funkcje poszczególnych "klocków" się nie dublują.
Go to the top of the page
+Quote Post

Posty w temacie


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: 15.10.2025 - 01:48