Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Wspólna logika dla różnych poziomów użytkowników
markonix
post 1.11.2017, 02:27:51
Post #1





Grupa: Zarejestrowani
Postów: 2 692
Pomógł: 288
Dołączył: 16.12.2008
Skąd: Śląsk

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


Może jest na to jakiś pattern lub chociaż dobra praktyka.

Mamy grupę prostych operacji CRUD w oparciu o zestaw: kontroler na wszystkie akcje (index, create, update, delete), walidacja, widoki, warstwa biznesowa (zapytania do bazy). Do tego ewentualnie tłumaczenia do widoków ale to mniej istotne.
Te akcje mogą być wykonywane przez użytkowników np. nauczycieli na ich poziomie (czyli mogą dodać ucznia, zmienić dane klasy itp.).

Teraz chciałbym dodać takie same możliwości dyrektorowi, który ma osobny panel typu sekretariat.
Zastanawiam się jak to ugryźć aby uniknąć nadmiernej duplikacji kodu.
Między operacją dokonaną przez dyrektora, a nauczyciela są różnice np. przy dodawaniu ucznia nauczyciel nie wybiera do jakiej klasy bo tą ma przyisaną, a dyrektor musi wybrać z listy select klasę.
Ta różnica ma wpływ na widok, walidację, reszta jest praktycznie taka sama.

Póki co w Laravel mam wydzielone do osobnych klas walidację (choć muszę tutaj jeszcze dodać ten jeden warunek) oraz wydzieloną logikę biznesową do repozytorium/eloquent. Pozostaje duplikacja kodu w widokach i kontrolerach. Widoki nie wiem? Wydzielić form do osobnych widoków i includować? A logika kontrolerów? Jedyne co mi przychodzi do głowy to jakieś osobne klasy lub traits.

Jakieś Wasze doświadczenia?

Ten post edytował markonix 1.11.2017, 02:29:59


--------------------
Go to the top of the page
+Quote Post
Pyton_000
post 1.11.2017, 10:16:43
Post #2





Grupa: Zarejestrowani
Postów: 7 864
Pomógł: 1381
Dołączył: 26.10.2005

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


Przecież nauczycieel i dyrektor ma dokładnie 99% tego samego. Jedyna różnica jak mówiłes to że dyrektor wybiera klasę. Więc wystarczy prosty warunek sprawdzający uprawnienia i wyświetla albo hidden z id klasy lub select z klasami. validacja zostaje ta sama, kontroler ten sam.

No chyba że czegoś nie zrozumiałem smile.gif
Go to the top of the page
+Quote Post
markonix
post 1.11.2017, 19:29:17
Post #3





Grupa: Zarejestrowani
Postów: 2 692
Pomógł: 288
Dołączył: 16.12.2008
Skąd: Śląsk

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


Nauczyciel i dyrektor mają zupełnie osobne panele - powiedzmy class/* ma nauczyciel, a management/* ma dyrektor. Różni się więc routing i cała otoczka wizualnie (template), i w sumie teraz też właśnie przypomniałeś o uprawnieniach (policy) ale to akurat może być wydzielone do klasy php (Policy to weryfikacja czy jest nauczycielem tej konkretnej klasy i/lub dyrektorem).

Ten post edytował markonix 1.11.2017, 19:53:54


--------------------
Go to the top of the page
+Quote Post
Pilsener
post 2.11.2017, 08:48:49
Post #4





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

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


Cytat
duplikacja kodu w widokach i kontrolerach

- w kontrolerach to nie problem, bo kontrolery nie zawierają kodu poza np. $service->doSth(), jeśli masz kod w kontrolerach to powinieneś go przenieść do serwisów
- w widokach jak wyżej, kod przygotowujący zmienne do templatek łatwo wydzielić do serwisów

Potem w serwisach bardzo łatwo jest wydzielić/sparametryzować wspólne bloki kodu.

Ten post edytował Pilsener 2.11.2017, 08:49:19
Go to the top of the page
+Quote Post
markonix
post 6.11.2017, 01:50:57
Post #5





Grupa: Zarejestrowani
Postów: 2 692
Pomógł: 288
Dołączył: 16.12.2008
Skąd: Śląsk

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


Cytat(Pilsener @ 2.11.2017, 08:48:49 ) *
- w kontrolerach to nie problem, bo kontrolery nie zawierają kodu poza np. $service->doSth()

Tu właśnie jest moment, który kazał mi wszystko przemyśleć.
W starych aplikacjach pisanych np na CI moje kontrolery są mega przerośnięte i zawierają dużo logiki i tam mega mnie drażniło gdy przenosiłem funkcjonalność z jednego panelu do drugiego, takie kopiuj wklej ponad 100 linijek gdzie musiałem zmienić jedną czy dwie. Teraz to znacznie odchudziłem przenosząc część do repository/modelów (pobieranie i operacje na danych), Requestów (walidacja), Policies (autoryzacja) ale i tak część rzeczy musi być w kontrolerze albo przynajmniej tak mi się wydaje. Jakaś logika requestu, upload, przekazanie różnych zmiennych potrzebnych do widoku. Nie da się albo przynajmniej nie wiem jak jeszcze bardziej odchudzić kontroler. Czy dodać jeszcze jedną warstwę coś pomiędzy kontroler, a repository, czy pchać do Trait'sów. Zastanawiałem się czy też jest opcja na jakaś re-używalność kontrolera - powiedzmy cały 'CRUD kontroler' i kilka innych prostych metod (np. do ustawiania jakichś prostych flag) używany w dwóch różnych kontekstach. U góry w kontrolerze tylko jakiś property z definiujący kontekst i potem w konkretnych metodach czasem jakiś if. Nie wiem czy to gra warta świeczki.

Pierwsze próby za mną.

Póki co wygląda to fajnie:
- trzeba na pewno napisać osobny routing tak aby ścieżki w drugim panelu wskazywały na kontroler bazowy
- autoryzacja jeżeli Policy przewiduje obie role - nie ma tu problemu
- zapytanie dodające do bazy jeżeli jest zbieżne tu i tu to nie ma problemu, ale na pewno będzie konieczność przekazania parametru bo przykładowo jak nauczyciel tworzy klasę ma od razu być dodany do grona, a dyrektor nie więc pewne akcje będą się różnić
- trzeba routing troszkę dopasować po stronie kontrolerów i widoków bo przykładowo store() i update() zadziałają ale już jest problem z przekierowaniem z powrotem do odpowiedniego panelu, nie zawsze da się użyć back(). Gdzieś globalnie trzeba ustalić w którym panelu jesteśmy (ja to zrobiłem w takim kontrolerze, po którym dziedziczą pozostałe) + przekazać do widoków aby w formularzach i linkach podmienić ścieżki.

Tak więc nie obędzie się bez paru IFów ale póki co poszło bez dziedziczenia, osobnych widoków czy trait'sów.

Ten post edytował markonix 6.11.2017, 01:51:45


--------------------
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: 21.02.2020 - 21:44