Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: MVC pjektowanie modelu
Forum PHP.pl > Forum > PHP > Object-oriented programming
nocturne
Witam Korzystam z DOCTRINE 2 i CodeIgniter. Zastanawiam się jak prawidlowo zbudować modele do czegos takiego:

W bazie mam 4 tabele

Post = zawiera podstawowe informacjie o poscie
Post_settings = dodatkowe wartosci dla posta
categorie = kategori do ktorej zostanie dowiazany psot
category_has_post = tablica laczaca

Żeby korzystać z doctrinie stworzylem modele ktore odzwierciedlaja wyglad mojej bazy.

Jak ma wygladac model ktory będzie doawał i edytował wpis ?

myslalem nad czyms takim:

  1. class wpis
  2. {
  3. private post; // obiekt kalsy Post
  4. privare post_settings; // tablica obiektow post_settings
  5. private categorie_dostepne; // tablica obiektow categorie
  6. private categorie_zaznaczone; // tablica obiektow categorie
  7.  
  8.  
  9. funkcja add(){} //dodawanie rekordow do TABLE category_has_post ,categorie ,Post_settings ,Post poprzez wywolanie odpowiednich regol z tych klas
  10. funkcja edit(){} // edycja wpisu
  11. funkcja get(){} //pobranie wpisu
  12.  
  13. }




Mam jeszcze 2 pytanie, wyslalem formularz z tym wpisem chcem teraz dokanac walidacjitablicy $_POST gdzie to powino sie robic ? w Mdelu wpis czy moze mam utworzyć biblioteke którą będzie wywolywal kontrooler gdzie będzie walidowała i obrabiała $_POSTA np striptags, trim, strtoupper , empty,in_number ?

toffiak
Napisałeś że korzystasz z Doctrine 2, ale u Ciebie tego nie widać, 4 tabele to 4 powinny być 4 encje z odpowiednimi powiązaniami. Mając powiązanie nie potrzebujesz żadnych metod get()/add().

Dodając nowy rekord tworzysz tylko nowy obiekt encji "persistujesz" go i zrzucasz menadżer encji.
Podobnie działa edycja: pobierasz encję zmieniasz jej właściwości i także zrzucasz.

Walidacją encji nie powinna zajmować się sama encja, do tego służą walidatory.
nocturne
Ja wiem ze nie potrzebuje takich funkcji działając na obiektach klas Post, Post_settings, categorie, category_has_post . Moje pytanie brzmi czy te klasy zamykać w osobnej klasie WPIS która będzie reprezentowała konkretny wpis na stronie. Do widoku przeslac obiekt Wpis
  1. $wpis // obiekt klasy wpis posiadający obiekty klas Post, Post_settings, categorie, category_has_post

czy :
  1. $post; // obiekt kalsy Post
  2. $array_post_settings; // tablica obiektow post_settings
  3. $array_categorie_dostepne; // tablica obiektow categorie
  4. $array_categorie_zaznaczone; // tablica obiektow categorie
toffiak
A może zamiast klasy Wpis/Wpisy wystarczy sama klasa Post, obiekty klasy Post poprzez relacje będą posiadały ustawienia (PostSettings) oraz kategorię do jakiej należy dany post.
I do widoku wystarczy przekazać sam obiekt post i w zależności od wymagać pobierać, lub nie, inne dane (kategorie, ustawienia itd...).
nocturne
Na poczaku założyłem ze ORM-a bede używłtylko do edycji/dodawania/kasowania bo nie chcialem korzystać OMR-a do selectow i joinow tylko PDO albo DBAL-a ale teraz zastanawiam sie czy nie lepiej korzystać z ORM-a bo tam bede mail to tak jak chce. Zakładając ze jednak nie skorzystam z tych relacji i bede chciał zaprojektować własną klasę Wpis z wszystkimi ustawieniami to tak miałaby onawygladać czy cośinaczej powinno wygladac ?
toffiak
Jeżeli już nie chcesz korzystać z relacji Doctrine 2, to i tak proponowałbym klasę Post jako tą która zawiera listę/tabele kategorię i właściwości samego posta (PostSettings), jest to bardziej naturalne.

Sama klasa Wpis jest właściwie niepotrzebna, za co ona odpowiada ?, chyba że miała by być menadżerem i odpowiadała za zarządzanie postami: coś w rodzaju findOneBy($id), find($id).
Tylko że to posiada Doctrine 2 i działa to niemal automatycznie.

Skoro więc "zaprzągłeś" do pracy ORM-a to wykorzystaj go w pełni.
nocturne
Założenie początkowe było toakie żeby w niej było wszystko przechowywane co jest mi potrzebne do Dodania/Usunięcia,Edycji i wyświetlenie 1 Wpisu. W Przypadku dodawania miała ustawiać jeden Obiekt klasy Post, obiekty Post_settings i category_has_post za pomoca danych z formularza $_POST ale rozumiem ze to mam zrobic wszystko w klasie Post tak ?
toffiak
Podsumowując:

Klasa Post posiada właściwości PostSettings oraz Category, obiekty tej klasy same się nie zapisują.
Do tego służy właśnie menadżer w twoim przypadku Klasa Wpis, choć ja bym ją nazwał inaczej (PostTable z sf 1.4 lub PostRepository sf 2, aby podkreślić że operuje on tylko na Postach).

Gdy otrzymujesz dane postem tworzysz nowy obiekt klasy Post, walidujesz go i wypełniasz go przesłanymi danymi. W tym momencie wkracza menadżer i to on zapisuje obiekt do bazy, lub gdziekolwiek indziej.


nocturne
Trochę się pogłębiłem. Co proponujesz ? Mam zamykać te Encjie w jakąś jeszcze klase ? czy korzystać tylko z Posta i gdzie mam ustawić obikety np post_settings i je zapisać korzystając z doctrine persist , flush Robic klase która to będzie wszystko robiłą jak poroponowałem np WPIS czy moze to wszystko ma być w klasie Post która ma relacjie do innych obiektów
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.