Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Podstawy REST i MVC
Forum PHP.pl > Forum > Przedszkole
kolouiy
Cześć wszystkim smile.gif
Zacznę od tego że jestem na ciągłym etapie nauki, tak więc jeżeli coś źle nazywam, bądź jest niejasne proszę o wyrozumiałość i nakierowanie mnie na właściwe tory smile.gif Robię pierwszy "większy" projekt i mam przy nim kilka męczących mnie "problemów".
Zacznę od opisu aplikacji.
Aplikacja składa się z:
a ) Frontend - HTML, CSS, JS, AJAX ? asynchroniczne zapytania do API
b ) Backend - PHP i MySQL ? warstwa dostępu do danych (API)
Frontend wysyła dane pobrane od użytkownika w formacie JSON, oraz czeka na odpowiedź API składające się ze statusu HTTP, oraz odpowiedzi w formacie JSON a następnie renderuje użytkownikowi graficznie te odpowiedzi.
Backend składa się z akcji oraz modelu.

AKCJE - w nich odbieram dane pochodzące z frontendu, sprawdzam ich poprawność (np. czy nie są puste) a następnie przekazuje je do potrzebnych modelów. Na przykład stworzenie nowego konta w projektowanym systemie wymaga stworzenie dwóch rekordów w tabeli Families oraz Users. W tym wypadku w akcji register.php powołuje się na dwa modele models/family.php oraz models/user.php.
MODELE - każdy model to osobna klasa reprezentująca tabele w bazie danych. Dodatkowo każda klasa posiada zestaw metod do wysyłania zapytań do bazy danych. Jeżeli zapytanie się powiedzie, metoda zwraca "true" oraz jeżeli istnieje potrzeba przypisuje pobrane dane do pól obiektów. Z kolei metoda zwraca "false" jeżeli zapytanie się nie powiedzie lub nie zwróci żadnego rekordu.

I teraz pytania:
1) Czy taką architekturę oprogramowania mogę nazwać MVC gdzie mój model to M, mój frontend to V, a moje akcje to C? Jeżeli nie, to jakiej architektury najbliższy jest taki typ aplikacji gdzie wszystko się dzieje bez odświeżania (SPA)?
2) Dosyć często w kilku akcjach korzystam z tych samych metod, przez co w każdej nowej akcji muszę pamiętać o walidacji danych (np. czy dane nie są puste). Czy dobrym pomysłem będzie przerzucenie tej walidacji do metod modelu? I z poziomu tych metod zwracanie statusu http oraz odpowiedzi co poszło nie tak? Czy będzie to zgodne z REST?
3) Czy korzystanie w jednej akcji (jeżeli to dobrze nazywam w kontrolerze) z kilku modelów jest poprawną praktyką? Na każdych tutorialach co widziałem każdy model miał swoje niezależne kontrolery. Z tym że w tych tutorialach bazy były bez żadnych relacji. A u mnie tak jak pisałem wcześniej np. rejestracja wymaga wstawienia rekordów w dwóch tabelach połączonych relacją.
Poniżej przedstawiam przykładowe dwa modele oraz akcję rejestracji które obecnie mam napisane. Mile widziane również małe review smile.gif

MODEL USER.PHP https://pastebin.com/uA9YATNy
MODEL FAMILY.PHP https://pastebin.com/CZ155mNi
AKCJA REGISTER.PHP https://pastebin.com/CtgSbFEK
viking
Zamiast tak rzeźbić zastosuj gotowy framework np laravel gdzie masz i łatwą walidację danych i autoryzację.
kolouiy
Cytat(viking @ 27.04.2019, 14:19:40 ) *
Zamiast tak rzeźbić zastosuj gotowy framework np laravel gdzie masz i łatwą walidację danych i autoryzację.


Właśnie chodzi o to że chciałbym sobie samemu zaimplementować. Nie chce stosować gotowych frameworków, a głównie dlatego że właśnie jeszcze się uczę. Lubię wiedzieć dokładnie jak coś się dzieje pod spodem, i chcę dokładnie zrozumieć logikę tworzenia takich aplikacji. Przede wszystkim chciałbym właśnie się dowiedzieć do której architektury można dopasować aplikacje SPA, a po drugie czyli jest to jakaś sensowna praktyka aby część walidacji danych zaimplementować bezpośrednio w klasach modelów zamiast w akcjach. Oczywiście wiąże się to z tym że komunikaty błędów również z poziomu tych metod bym musiał zwracać, a na wszystkich tutorialach jest to z poziomu kontrolera (jeśli dobrze rozumiem u mnie akcje to kontroler). Pytanie brzmi dlaczego?
viking
I właśnie dlatego że się uczysz nie powinieneś sam tego robić. Nie ma co ukrywać że twój kod jest zwyczajnie niskiej jakości. Popatrz jak to robią inni i ucz się od lepszych. Własne rozwiązania można pisać mając duże doświadczenie.
kolouiy
Cytat(viking @ 27.04.2019, 15:04:02 ) *
I właśnie dlatego że się uczysz nie powinieneś sam tego robić. Nie ma co ukrywać że twój kod jest zwyczajnie niskiej jakości. Popatrz jak to robią inni i ucz się od lepszych. Własne rozwiązania można pisać mając duże doświadczenie.


Dzięki za zainteresowanie. To że jest to kod niskiej jakości to się domyślam. Zależy mi jednak aby nie stosować żadnego frameworka. Proszę napisz co według ciebie jest tutaj słabe. Niestety sama informacja że jest niskiej jakości nie wskazuje mi na to co dokładnie jest do kitu.
Poczytałem o wzorcach i to co tworzę pasuje mi bardziej nawet do MVP niż MVC jeżeli dobrze rozumiem różnice.
Tak czy siak doszedłem do wniosku że cała walidacja jednak powinna znajdować się w modelu. Czy mam rację? Czy sensownym posunięciem będzie zrobienie setterów/getterów na pola a następnie w tych setterach użyć np. wyrażeń regularnych do walidacji?
viking
Aktualna wersja php to 7.3 a twój kod nawet nie stoi w pobliżu 3-letniej 7. Nie stosujesz reguł PSR. Nie stosujesz deklaracji typu. Przykładowo takie $db w konstruktorze może być stringiem przez przypadek i to jest ok. Nie wiem co zawiera database więc pewnie reszta kodu się wywali i tak w przypadku braku połączenia. Klasy zawierają wszystko - od filtrowania danych, przez ustawianie nagłówków (których zmiana w tym miejscu może już nie być możliwa tak na marginesie), echowanie i jeszcze zwracanie wartości. Propertiesy są publiczne więc w każdym miejscu można podstawić co się chce nie patrząc czy to powinno być dozwolone. Plik rejestracji to zwykła sieczka pełna ifów. Ciekawe jak ma wyglądać kolejna akcja i co się stanie jak mail nie wyjdzie? Ja osobiście nie jestem zwolennikiem walidacji w modelach ale co kto lubi.
kolouiy
Cytat(viking @ 28.04.2019, 07:28:23 ) *
Aktualna wersja php to 7.3 a twój kod nawet nie stoi w pobliżu 3-letniej 7. Nie stosujesz reguł PSR. Nie stosujesz deklaracji typu. Przykładowo takie $db w konstruktorze może być stringiem przez przypadek i to jest ok. Nie wiem co zawiera database więc pewnie reszta kodu się wywali i tak w przypadku braku połączenia. Klasy zawierają wszystko - od filtrowania danych, przez ustawianie nagłówków (których zmiana w tym miejscu może już nie być możliwa tak na marginesie), echowanie i jeszcze zwracanie wartości. Propertiesy są publiczne więc w każdym miejscu można podstawić co się chce nie patrząc czy to powinno być dozwolone. Plik rejestracji to zwykła sieczka pełna ifów. Ciekawe jak ma wyglądać kolejna akcja i co się stanie jak mail nie wyjdzie? Ja osobiście nie jestem zwolennikiem walidacji w modelach ale co kto lubi.

Dzięki wielkie smile.gif
Korzystałem widocznie z dziadowskiego tutoriala co do rest api smile.gif I część praktyk o których wspominasz znam, tylko zbyt zaufałem tutorialowi, co więcej znalazłem kilka tutków napisanych w ten sam sposób...
Czyli już mam wnioski z twojej wypowiedzi smile.gif

1. Pola prywatne, ustawiane/odczytywane przez settery i gettery.
2. Cała walidacja idzie do modelu.
3. Instaluje PHP 7 i zaczynam stosować typowanie.

Także jeszcze raz bardzo dziękuję za czas i opinie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.