Wzorzec MVC + PHP |
Wzorzec MVC + PHP |
6.04.2013, 06:32:00
Post
#1
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.03.2013 Ostrzeżenie: (0%) |
Witam w wielu aplikacjach bazodanowych jest zastosowany wzorzec MVC. Mam w związku z tym kilka pytań. Model można potraktować jako tabelę w bazie danych, ale problem zaczyna się w momencie kiedy dajemy select-a i zbieramy dane z różnych tabel. Jak radzicie sobie wtedy z wyśwtetlaniem widoku?
Pozdrawiam |
|
|
6.04.2013, 07:00:44
Post
#2
|
|
Grupa: Zarejestrowani Postów: 114 Pomógł: 12 Dołączył: 15.02.2012 Ostrzeżenie: (0%) |
Model to nie tabela a część systemu, która m. in. z bazą danych pracuję. Model do widoku może zwracać po prostu zasób z bazy danych lub tablicę, to zależy od programisty i jego potrzeb.
-------------------- Pomogłem? Kliknij POMÓGŁ
|
|
|
6.04.2013, 07:03:13
Post
#3
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.03.2013 Ostrzeżenie: (0%) |
Czyli modelu mogę użyć do zapisu obiektów trwałych do bazy danych? Czyli że każda klasa odpowiada encji w bazie danych.
|
|
|
6.04.2013, 08:56:32
Post
#4
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) |
MVC to styl budowy aplikacji, a nie coś co jest powiązane z bazą danych. Model odpowiada za odczyt/zapis do pliku/bazy/cache, operacje na danych.
-------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
6.04.2013, 11:03:18
Post
#5
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) |
Jak tworzysz wiele modeli gdzie będą wykonywane operacje CRUD można pokusić o jakąś normalizacje iż model ma jedną tabele.
To się sprawdzi przy szybkim budowaniu aplikacji - poprzez dziedziczenie po modelu głównym tworząc np. model "animal" masz od razu dostępne metody update, delete, insert przyjmując, że operują na tabeli "adnimal" bądź "animals". Widziałem, że niektóre FW mają takie mechanizmy. Potem jeżeli chcesz łączyć z innymi tabelami to tworzysz metodę z zapytaniem z JOINem i zwracasz obiekt bądź tablice obiektów bądź tablicę (kto jak lubi, ja osobiście te 2 pierwsze zazwyczaj stosuje) lub oczywiście jakąś wartość pojedynczo typu prostego. Zazwyczaj staram się nazwy tabel trzymać gdzieś "u góry" aby ewentualna zmiana była mało problematyczna (chociaż z drugiej strony i tak nie obejdzie się przez edycje kilku plików, a dla IDE nie ma znaczenia ilość wystąpień przy refaktoryzacji). Ten post edytował markonix 6.04.2013, 11:05:29 -------------------- |
|
|
6.04.2013, 12:28:39
Post
#6
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.03.2013 Ostrzeżenie: (0%) |
Z tego co wyczytałem:
Model: klasy etc wraz z metodami, które można wykonywać na owych klasach Widok: tutaj wyświetlamy efekt przygotowań ( przetworzony model ) Kontroler: Decyduje jakie operacje mają być użyte na konretnej klasie |
|
|
6.04.2013, 12:58:11
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 168 Pomógł: 126 Dołączył: 5.02.2010 Skąd: Świdnica Ostrzeżenie: (0%) |
Mniej więcej.
Tak jak już miałeś napisane wyżej: Model - pobiera lub zapisuje dane i tu w zależności od Ciebie może to być do pliku, do bazy etc.... Controller - Steruje całością, to on jest uruchamiany przy jakiejś akcji, decyduje co pobrać z bazy lub co do niej wysłać i zapisać, a na koniec przedstawia wszystko za pomocą View. View - przedstawia wynik działania. |
|
|
6.04.2013, 13:05:32
Post
#8
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) |
Mniej więcej. Tak jak już miałeś napisane wyżej: Model - pobiera lub zapisuje dane i tu w zależności od Ciebie może to być do pliku, do bazy etc.... Controller - Steruje całością, to on jest uruchamiany przy jakiejś akcji, decyduje co pobrać z bazy lub co do niej wysłać i zapisać, a na koniec przedstawia wszystko za pomocą View. View - przedstawia wynik działania. Ileż razy będzie trzeba to powtórzyć, zanim ktoś użyje wyszukiwarki. -------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
6.04.2013, 13:10:05
Post
#9
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.03.2013 Ostrzeżenie: (0%) |
Czyli tak naprawdę pobrane coś z bazy ( dzięki kontrolerowi ) nie musi być żadnym z obiektów tego modelu, równie dobrze może to być misz masz typu var = select bla bla ( bla bla to jakiś join ). Zgadza się? i ten var następnie jest wysyłany do widoku i przedstawiany w jakiejś tabeli.
|
|
|
6.04.2013, 13:13:16
Post
#10
|
|
Grupa: Zarejestrowani Postów: 1 168 Pomógł: 126 Dołączył: 5.02.2010 Skąd: Świdnica Ostrzeżenie: (0%) |
W UsersModel mam np.
Czyli zwraca mi to z bazy wszystkie kolumny, które należą do użytkownika o podanym imieniu. Jak tego używać: W kontrolerze w jakiejś metodzie
Coś w tym stylu. |
|
|
6.04.2013, 13:22:58
Post
#11
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) |
Czyli tak naprawdę pobrane coś z bazy ( dzięki kontrolerowi ) nie musi być żadnym z obiektów tego modelu, równie dobrze może to być misz masz typu var = select bla bla ( bla bla to jakiś join ). Zgadza się? i ten var następnie jest wysyłany do widoku i przedstawiany w jakiejś tabeli. Kontroler nie pobiera nic z bazy, robi to model, który zawraca dane do kontrolera, głównie przez return, wtedy kontroler wysyła je do widoku. -------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
6.04.2013, 13:23:14
Post
#12
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.03.2013 Ostrzeżenie: (0%) |
Dziękuję.
A jak User ma wiele Cars ( Users -----< Cars ) i chcę wyszukać imię, nazwisko i samochody użytkownika to taką metodę najlepiej gdzie umieścić ( zaznaczam jednak, że zapytanie zwróci trochę danych z Users i Cars ). |
|
|
6.04.2013, 13:25:22
Post
#13
|
|
Grupa: Zarejestrowani Postów: 1 168 Pomógł: 126 Dołączył: 5.02.2010 Skąd: Świdnica Ostrzeżenie: (0%) |
To nadal w modelu, bo jest to operacja na danych.
Teraz tylko zostaje kwestia ułożenia dobrego zapytania do bazy i to wszystko. |
|
|
6.04.2013, 14:02:17
Post
#14
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.03.2013 Ostrzeżenie: (0%) |
Już rozumiem :-) Dotąd myślałem, że zwrócony efekt zapytania musi być jakimś obiektem klasy w modelu :-) Co w przypadku takich złączeń założenie jest bezsensowne i nadmiarowe
A jak dodaje coś do bazy to walidacja gdzie ma być? |
|
|
6.04.2013, 14:13:15
Post
#15
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) |
W modelu. Kontroler tylko monitoruje ewentualne błędy.
-------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
8.04.2013, 18:18:23
Post
#16
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.03.2013 Ostrzeżenie: (0%) |
Mam jeszcze kilka pytań koncepcyjnych.
Załóżmy, dalej że mam bazę danych Człowiek - Samochody ( jeden człowiek może mieć wiele samochodów ), zatem tworzę dwie klasy zawierające takie właściwości jak encja w bazie danych i fajnie to wszystko można zapisywać <- Okej. Pytanie co z pobieraniem danych do widoku ( to mnie bardzo nurtuje ). Gdzie umieścić zapytanie zwracające imię, nazwisko i markę pijazdu każdego użytkownika w bazie?? Takie zapytanie nie zwróci żadnego obiektu, który by tym klasom podlegał. Zwróci jakiś nieznany typ. Jak wy dobieracie modele do pracy z bazą ? ( zapis/odczyt ). Pozdrawiam |
|
|
8.04.2013, 21:07:24
Post
#17
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
No jak to co? Obiekt klasy Człowiek jest w relacji z obiektem klasy Samochód. Tym samym wiesz, że istnieje pomiędzy nimi relacja, w której klasa Człowiek ma metodę getSamochody(), zwracającą tablicę obiektów klasy Samochód. I w sumie tyle. Teraz więc do widoku przekazujesz tablicę obiektów klasy Człowiek i po kolei lecisz.
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
8.04.2013, 21:11:03
Post
#18
|
|
Grupa: Zarejestrowani Postów: 25 Pomógł: 0 Dołączył: 29.03.2013 Ostrzeżenie: (0%) |
getSamochody() zwraca rekordy z tabeli samochody + kilka pól z Człowiek, więc już nie zwróci strikte obiektów klasy Samochody? ( tak mi sie wydaje ). Może w pseudkodzie klas pokaż jak winien taki model mały wyglądać. Dużo mi to rozjaśni ( a raczej rozwieje wątpliwośćci o ogólnie MVC to już zaczaiłem prawie ).
Ten post edytował felkowyLudzik 8.04.2013, 21:14:54 |
|
|
8.04.2013, 22:33:16
Post
#19
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) |
Jeżeli byś chciał listę użytkowników wraz z samochodami to albo robisz pętle (mniej wydajne choć wygodniejsze, czasem można sobie pozwolić) albo po prostu metodę z JOINem. Jeżeli dołączasz do tabeli users tabele cars to wg mnie metoda powinna być w users. Np. public function get_users_with_cars() Ten post edytował markonix 8.04.2013, 22:35:23 -------------------- |
|
|
9.04.2013, 08:35:06
Post
#20
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D |
Markonix dobrze CI podpowiada... Są 2 możliwości najpopularniejsze:
- pobierasz tablicę obiektów Człowiek i w pętli potem odpytujesz o elementy Smochód będące w relacji z nią, - tworzysz sobie repozytorium funkcji powiązanych z klasą Człowiek, która może mieć takową zdefiniowaną. Tak poza tym jeśli chodzi o logikę, to chyba zapomniałeś, że samochód może należeć do więcej niż jednej osoby. Samochód może mieć współwłaściciela, czyli mamy relację nie jeden człowiek do wielu samochodów, ale wiele do wielu. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
Wersja Lo-Fi | Aktualny czas: 23.04.2024 - 11:28 |