![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Witam wszystkich,
Ostatnio zacząłem czytać o obiektowym php5, MVC, frameworkach i postanowiłem zacząć pisać kod, który byłby dla mnie wygodny oraz co ważne - nadawał się do powtórnego wykorzystania. Opiszę to co do tej pory zrobiłem. Proszę Was, znaczniej bardziej doświadczonych programistów, o uwagi na temat mojego podejścia. Zaznacze, że swoją pracę oparłem do tej pory na artykule Frameworki z php.pl, framework CakePHP oraz o wypowiedzi forumowiczach w topikach MVC. Charakterystyka ogólna: Drzewo projektu Kod |- actions/ (tu wrzucam kontrolery w postaci class.NazwaKontrolera.php) |- conf/ |- models/ (tu będą modele, do tej pory nic tam nie mam) |- lib/ | +-- core/ - tu są moje pliki wykorzystywane w całej aplikacji | +-- class.Dispatcher.php | +-- class.Controller.php |- templates/ - szablony Smarty | |- index.php Oczywiście nie jest to finalny widok drzewa projektu. Ale nie to jest ważne. Jak działa mój framework? index.php uruchamia Dispatcher, który parsuje URL. Jeżeli następuje zgłoszenie index.php/Akcja1/Parametr1/Parametr2/, to dispatcher załącza kontroler Akcja1, a następnie kontroler tej akcji wywołuje na sobie (w zasadzie na potomku) metodę Parametr1 z parametrem Parametr2. Przykład: strona.pl/index.php/Uzytkownik/Pokaz/1234. Dispatcher przekaże kontrolę do kontrolera Uzytkownik. Ten natomiast włączy metodę Pokaz(1234); Generalnie wygląda to właśnie tak. Z tego co czytałem, to chyba całkiem logiczne rozwiązanie. Oczywiście mogę się mylić... Pliki
Będę Wam ogromnie wdzięczny za uwagi. Pozdrawiam serdecznie, Adrian. Ten post edytował Prph 4.03.2006, 19:40:41 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
Cytat(Martio @ 2006-03-11 14:04:49)
Nie powinno być interface Model, ani extends Model. Ba, słowo Model nie powinno się w ogóle pojawić w kodzie php. Bo Model to warstwa, tak samo jak Widok. Nie robimy klasy Widok, bo nie wiadomo, co niby miałaby robić. Nie robimy klasy HTML z metodami wyświetlTo(), wyświetlTamto() itd. Tak samo nie robimy klasy Model z wieloma metodami, bo to kolejny przykład god class. Nie chcę krytykować, bo zaprojektowanie Modelu jest chyba trudniejsze niż sam wzorzec MVC. Np. twoja klasa Publikacje też robi za dużo. Należałoby rozbić to na kontener publikacji, odpowiedzialny za wyszukiwanie (wg. różnych kryteriów) oraz samą klasę Publikacja, odpowiadającej zawsze jednemu rekordowi w bazie danych. Całość należałoby wepchnąć we wzorzec UnitOfWork, w celu zarządzania transakcjami, i dorzucić wzorzec IdentityMap, w celu zapewnienia, że nie będą po aplikacji krążyły dwie instancje klasy Publikacja odpowiadające temu samemu rekordowi. Jak widać, jest to skomplikowane... a jak już się uda to wszystko obiektowo zaprojektować, cały system zaczyna się walić, bo relacyjnej bazy danych nie da się odwzorować za pomocą obiektów. Takie zapytania jak "pokaż tytuły 10 publikacji o największej liczbie komentarzy" lub "usuń wszystkie publikacje starsze niż 1 rok" nie pasują do stworzonej klasy Publikacja. @Prph: Wyświetlanie "standardowej strony www" z naglówkiem, stopką itd. nie jest wspierane specjalnie przez samo MVC. Generalnie stałe elementy strony przynależą do Widoku. Można dziedziczyć klasy Widoku po jakiejś klasie bazowej, która potrafi wygenerować stałe elementy strony. Można przekazać do instancji klasy Widoku obiekt odpowiedzialny za layout strony, tak, aby obiekt Widoku mógł się "wkleić" w miejsce przeznaczone na content. A co do konfiguracji, to oczywiście zależy. Najpierw odróżnij konfigurację całej aplikacji (uwierzytelnianie, połączenie z DB, itd) od konfiguracji pojedynczej akcji (np. prawa dostępu). To drugie czasem umieszczane jest w samej akcji (np. stare Mojavi). Najlepiej jest mieć system, który obsługuje różne źródła danych (pliki ini, tablice, XML, itd), wymieniając tylko obiekt odpowiedzialny za wczytywanie pliku z konfiguracją. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 7.10.2025 - 11:37 |