Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Wzorzec MVC + PHP
felkowyLudzik
post 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
Go to the top of the page
+Quote Post
spokoloko123
post 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Ł
Go to the top of the page
+Quote Post
felkowyLudzik
post 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.
Go to the top of the page
+Quote Post
!*!
post 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).
Go to the top of the page
+Quote Post
markonix
post 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


--------------------
Go to the top of the page
+Quote Post
felkowyLudzik
post 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
Go to the top of the page
+Quote Post
Szymciosek
post 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.
Go to the top of the page
+Quote Post
!*!
post 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%)
-----


Cytat(Szymciosek @ 6.04.2013, 13:58:11 ) *
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).
Go to the top of the page
+Quote Post
felkowyLudzik
post 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.
Go to the top of the page
+Quote Post
Szymciosek
post 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.

  1. public function getUserByFirstName($_name)
  2. {
  3. return $this->connect->query("SELECT * FROM users WHERE name=:name", array(':name' => $_name));
  4. }


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
  1. $this->user = $usersModel->getUserByFirstName('Szymek');
  2. echo $this->user;


Coś w tym stylu.
Go to the top of the page
+Quote Post
!*!
post 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%)
-----


Cytat(felkowyLudzik @ 6.04.2013, 14:10:05 ) *
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).
Go to the top of the page
+Quote Post
felkowyLudzik
post 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ćquestionmark.gif ( zaznaczam jednak, że zapytanie zwróci trochę danych z Users i Cars ).
Go to the top of the page
+Quote Post
Szymciosek
post 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.
Go to the top of the page
+Quote Post
felkowyLudzik
post 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 smile.gif

A jak dodaje coś do bazy to walidacja gdzie ma być?
Go to the top of the page
+Quote Post
!*!
post 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).
Go to the top of the page
+Quote Post
felkowyLudzik
post 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
Go to the top of the page
+Quote Post
thek
post 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
Go to the top of the page
+Quote Post
felkowyLudzik
post 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
Go to the top of the page
+Quote Post
markonix
post 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%)
-----


  1. public function get_cars_by_user_id($user_id) {
  2.  
  3. // select cars where user_id
  4. return $array;
  5.  
  6. }
  7.  
  8. $array <- tablica obiektów samochodów (czyli inaczej wierszy z tabeli DB, alternatywnie po prostu tablica z właściwościami)


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


--------------------
Go to the top of the page
+Quote Post
thek
post 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
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 19.04.2024 - 00:50