Szablony i wzorzec MVC
Opublikowane przez Jarosław Zabiełło
Wzorzec MVC
MVC to skrót od ang. Model – View – Controler (czyli Model – Widok – Kontroler). Jest to jeden z popularniejszych wzorców projektowych (czy “wzorców architektonicznych w oprogramowaniu” jak się mogą czepiać niektórzy puryści) W uproszczeniu, wzorce projektowe to standardowe, sprawdzone rozwiązania dla typowych problemów programistycznych (głównie dotyczą programowania obiektowego). Ich przeciwieństwem są anty-wzorce, czyli to, jak nie należy programować. Typowym antywzorcem jest spaghetti-code, wymieszanie logiki biznesowej z warstwą prezentacji, wszystkiego razem w jednym śmietniku. To typowy styl programowania większości niedoświadczonych programistów PHP.
W skrócie, wzorzec MVC polega na takim podziale kodu, aby składał się z trzech, funkcjonalnie oddzielnych części.
Model
Modelem nazywamy tą część kodu aplikacji, która jest odpowiedzialna za kontakt z danymi biznesowymi, gdziekolwiek są składowane (zwykle w relacyjnej bazie danych). Model nie tylko służy do pobierania i modyfikacji danych biznesowych, ale także zajmuje się ich spójnością i integralnością poprzez odpowiednie mechanizmy walidacji danych. Model służy więc za zarówno strażnika jak i dysponenta danych biznesowych. Bardzo elegancko widać to w Ruby on Rails gdzie przykładowy kod pełniący rolę modelu wyglądać może tak:
class Project < ActiveRecord::Base
belongs_to :portfolio
has_one :project_manager
has_many :milestones
has_many :deliverables, :through => :milestones
validates_presence_of :name, :description
validates_acceptance_of :non_disclosure_agreement
validates_uniqueness_of :short_name
endWidok
Widok służy do generowania tego, co moglibyśmy określić jako prezentację naszej aplikacji. Przy czym nie jest określone jak ta prezentacja ma wyglądać. Ogólnie prezentacją jest to wszystko, co aplikacja “wypluwa” na zewnątrz. Nie musi to być żaden “interfejs użytkownika” jak wypisują bzdury co niektórzy. Model MVC nie zakłada przecież tego, kto ma być odbiornikiem wysyłanego strumiena danych. Może to być zarówno pani Genowefa miotająca się po internecie za pomocą Internet Explodera jak i rozbudowany czytnik kanałów RSS, albo jakieś dowolne urządzenie odbierające generowany strumień danych (w tym ostatnim wypadku nie musi to być w ogóle aplikacja webowa) Generowany strumień danych nie musi być w ogóle żadnym tekstem. Mogą to być bowiem równie dobrze strumień danych binarnych.
Zresztą tak właśnie działają aplikacje webowe, które działają wg zasady client-server. Tzn. klient wysyła żądanie, a serwer odpowiada. Przeglądarka Iinternetowa wysyła żądanie do serwera WWW, a on odpowiada jej strumieniem danych. (w wypadku aplikacji webowych serwer wysyła wpierw tekst z nagłówkiem informującym co będzie wysyłane, bo to wynika z zasad protokołu HTTP).
BTW, z tego wynika ważna lekcja odnośnie adresów URL. To co wklepujemy w przeglądarce nie musi mieć żadnego związku z jakimikolwiek ścieżkami na serwerze. Wszystkie technologie, używające jawnych rozszerzeń plików (.asp, .php, .jsp, .aspx itp) są głupie, bo po pierwsze, sugerują że to coś w adresie z końcówką .php to zawsze jest konkretny plik po konkretnym katalogu. Po drugie, bez sensu eksponują użytą technologię, co wiąże trochę ręce tym, którzy by chcieli zmienić wewnetrzny system generujący strony WWW ale bez ruszania starych adresów URL. Po trzecie, spidery takie jak Google nie lubią indeksować stron generowanych dynamiczne. Jeśli zobaczą w adresie znak zapytania to najczęściej to, co za nim stoi jest ignorowane. Odbija sie to na “pozycjonowaniu” tak napisanej aplikacji. I po czwarte takie adresy (z rozszerzeniami i parametrami po znaku zapytania) są najzwyczajniej brzydkie i trudne do zapamiętania. Nie znaczy to, że tak (/?x=1&y=2&z=4)w ogóle nie przekazywać parametrów. Chodzi tylko o to, aby to robić to oszczędnie i tylko wtedy, kiedy jest to naprawdę koniecznie.
Kontroler
Kod, który spina wszystko razem i stanowi serce aplikacji to kontroler. To on pobiera dane z bazy za pomocą modelu i to on wybrane dane wysyła do widoku aby je jakoś zaprezentował dla odbiorcy. Kontroler także dba o takie kwestie jak autoryzacja i autentykacja użytkowników (określa kto może mieć dostęp do poszczególnych części aplikacji). Kontroler zajmuje się też sposobem przepływu danych zgodnie z potrzebami logiki biznesowej.
Szablony i Helpery
Czym są szablony? Szablony przynależą do warstwy Widoku wzorca MVC. Otrzymują dane z kontrolera i na tej podstawie generują kod HTML jaki jest wysyłany do przeglądarki. Szablony powinny być raczej proste tak, aby można było łatwo modyfikować sposób prezentacji bez godzin ślęczenia nad kodem. Najczęściej kwestią prezentacji zajmują się różnej maści webmasterzy i designerzy, czyli ogólniej osoby, które niekoniecznie są zaawansowanymi programistami.
W wypadku kiedy sposób prezentacji jest złożony, aby nie komplikować szablonu stosuje się do pomocy… pomocnika ;) Głównym zadaniem helpera jest takie wstepne przetworzenie danych (jakie kontroler wrzucił do szablonu) aby szablon mogący je wyświetlić był jak najprostszy i jak najbardziej czytelny. Helper dane pobiera od szablonu, modyfikuje je i odsyła je z powrotem. Dzięki temu logika niezbędna do wygenerowania prezentacji jest w szablonie znacznie uproszczona.
Szablony można podzielić na kilka rodzajów, stosownie do oczekiwanych od nich funkcji. Ale o tym (i o strategii wyboru właściwych szablonów) już w drugiej części.



Dobre, myślę, że sporo wyjaśni ten tekst osobom, które nie wiedzą co to MVC, logika biznesowa itp.
Niestety kolejny ogólnikowy opis aczkolwiek napisany składnie i jasno, według mnie tłumaczenie czym jest mvc bez podania jakichkolwiek przykładów (czy to kod czy jakiś a’la życiowy przykład) jest trochę bez sensu. Czy osoba która do tej pory miała wszystko w jednym worku będzie w stanie logicznie przenieść/poukładać poszczególne funkcjonalności? PS Świetny blog, Pozdrawiam Autora
Przykładów jest od cholery w sieci. Ostatnie dwa lata to okres ogromnej popularności i wysyp różnej maści frameworków MVC. Moim celem było dać przejrzysty opis samego MVC. (Właściwie to chodziło mi o praktyczne porównanie szablonów, a ten tekst powstał przy okazji. W drugiej części będzie o szablonach – głównie dla Pythona – bo jest w czym wybierać)
Mam nadzieję, że będzie choć trochę o szablonach w Rubim – aktualnie szukam czegoś co byłoby dobrym zamiennikiem dla erb.
przykładów na MVC jest więcej niż składnych opisów czym MVC jest w istocie i co w jakiej części powinno się znaleźć. Po za tym jeden suchy przykład i tak nie ma sensu. Sens ma dopiero przejście przez jakiś większy tutorial – np. przez pierwsze rozdziały z książki “Agile Web Development with Rails”. Moim zdaniem praca u podstaw, zrozumienie założeń i generalnych idei jest często ważniejsze niż zaznajomienie się z implementacją konkretnego przykładu. W każdym razie czekam na kolejne części cyklu :)
Nie chce aby autor popadl w samouwielbienie, ale po raz kolejny świetna robota!!! Oby wystarczylo checi na przyszlość:)
Logika aplikacji w kontrolerze?
a możecie podać jakiś link do dobrych przykładów MVC ?
“a możecie podać jakiś link do dobrych przykładów MVC ?” chyba nie tak wiele ich jest skoro nikt nie pokwapił się odpowiedzieć, a szkoda bo właśnie sam takowych szukam.
Przykładów MVC, znaczy się czego? Jakichś aplikacji, frameworków? Od cholery tego jest. Np. Ruby on Rails, Django, Pylons, CakePHP, Symfony, itp. itd.
Przydał by się przykład lub link do prostej aplikacji, nie frameworków, tylko konkretnej implementacji (prostej) aplikacji bez zbędnych bajerów i ozdobników.
Wojtek: nie rozumiesz koncepcji czy co?Frameworki używa się po to aby łatwiej stworzyć i potem rozwijać jakieś nietrywialne aplikacje. Jeśli jednak potrzebujesz tylko stworzyć jakąś banalną, jedną stronkę z wizytówką, to nie potrzebujesz do tego MVC. Poza tym frameworki potrafią być bardzo proste. Merb z opcją
very_flatredukuje się do jednego pliku. Są też całe mikroframeworki z definicji operujące na takim poziomie jak Sinatra, Camping, Wave itp.Ciekawy artykuł, właśnie jestem w trakcie tworzenia własnego FW…
trochę ciężko pojąć od razu logikę MVC.. ale dzięki takim artykułom powoli się to staje realne :)
Wygląda jak wpis robiony metodą kopiego-pejsta: http://www.mephir.net.pl/model-mvc
MrBogus: faktycznie koleś bezczelnie splagiatował tekst. Nawet nie ma jak umieścić mu tam komentarza bo ta jego strona wywala się z uroczym pehapowym błędem “Fatal error: Call to undefined function drupal_submit_form() in /var/www_prod/mephir.net.pl/sites/all/modules/akismet/akismet.module on line 707 Call Stack”
MVC zaliczają do kategorii wzorców złożonych, a czy ktoś obeznany by mógł wymięć jeszcze jakieś inne wzorce z tej grupy??(wystarczy same nazwy)