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%)
-----


Zdecydowanie źle zrozumiałem ideę Services. Dokumentacja i przykładowa aplikacja trochę tutaj wprowadzają w błąd (albo ja źle odebrałem), bo nie piszą o tym aby "algorytmy" przenosić do Services tylko bardziej rozumiałem to jako zewnętrze usługi typu mailer wałkowany w dokumentacji czy np. parser bbcode itp. Jakoś nie miałem świadomości, że można tam wrzucać core samej aplikacji, ale faktycznie ma to sens, bo można w ten sposób uzyskać wiele kodu, który może przydać się w innych miejscach - np. gdybym w tej "dummy app", którą tu opisywałem chciał np. zrobić kiedyś ćwiczenie tygodnia, to wystarczy odpowiednia refektorować kod w Service. a nie znowu dłubać w samym kontrolerze.

Wczoraj spróbowałem tego podejścia w aplikacji nad którą pracuję, a która ma podobny problem jak ten powyżej tylko trochę bardziej rozbudowany i na pewno kod wygląda o wiele lepiej niż kontroler z bzyliardem funkcji.
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: 11.10.2025 - 23:32