MVC | Model-View-Controller
Nadszedł czas na omówienie fundamentalnego dla większości frameworków wzorca projektowego. Wzorzec ten cieszy się największą popularnością. Jest szeroce implementowany i ma również swoje odmiany i rozszerzenia.
W tym artykule wyjaśnię dokładnie czym jest wzorzec projektowy MVC oraz na jak działa .
Jest to kwestia bardzo ważna, ponieważ większość frameworków PHP i aplikacji jest opartych na tym wzorcu projektowym. Oczywiście implementują one również dużo innych wzorców, jednak ten jest ich rdzeniem. To fundament architektury tych frameworków i aplikacji na nich budowanych (np. Laravel, CodeIgniter).
Jeśli masz problemy ze zrozumieniem tego tematu, nie wiesz co to jest lub po prostu masz jakiekolwiek wątpliwości – w tym artykule wszystko rozjaśnię .
Co to jest MVC?
Otóż MVC (skrót od Model-View-Controller) jest wzorcem projektowym, który polega na separacji odpowiedzialności za aplikację pomiędzy trzy jednostki; model, widok oraz kontroler.
Te trzy jednostki współpracują ze sobą w pełnej synergii by obsłużyć cały system wraz z jej logiką.
Żądanie / akcja użytkownika wprawia w ruch kontroler który następnie je obsługuje w ścisłej współpracy z modelem by dostarczyć użytkownikowi odpowiedź w postaci odpowiednio zaprezentowanych danych których z kolei użytkownik oczekuje.
Tak to wygląda, choć można to zobrazować i przedstawić na bardzo wiele sposobów.
A prościej?
Żądanie odbiera odpowiedni kontroler który komunikuje się z modelem. Model zaś zarządza wszelkimi danymi i dostarcza je kontrolerowi. Ten natomiast mając już dane jest wstanie dostarczyć odpowiedni widok (z danymi) użytkownikowi.
A jeszcze prościej...?
W istocie zamiast trzymać wszystko w jednym pliku - pobieranie danych i odpowiednie ich przygotowanie, wyświetlenie razem z szablonem... innego typu akcje jak choćby wysłanie mejla - trzymamy to w przynajmniej 3 osobnych plikach. Jeden jest odpowiedzialny za obsługę żądania, drugi jest odpowiedzialny za obsługę danych a trzeci jest odpowiedzialny za ich prezentację.
Tyle. Nic bardziej skomplikowanego. Powiedzmy że masz stronę z kodem PHP - w jednym pliku. To jest po prostu rozłożenie go na trzy osobne pliki. I to tyle. Naprawdę.
Dlaczego w przynajmniej 3 osobnych plikach?
Ponieważ może to być bardziej rozbudowane, gdzie występuje delegacja do innych klas czy takie systemy jak choćby eventy...
Ale sam MVC o to się opiera - model, widok i kontroler. Reszta nie należy strikte do tego wzorca projektowego i jest jego jedynie rozbudowaniem. A raczej rozbudowaniem architektury aplikacji która opiera się o MVC.
Bardziej obrazując
Masz jeden wielki plik, gdzie robisz bardzo wiele rzeczy. Bardzo dużo linii, kod śmierdzi, jest po prostu syf w pliku. Robisz zbyt dużo rzeczy na raz. I hard-kodujesz bardzo wiele rzeczy, kod nie jest za bardzo przenaszalny, re-używalny. Ciężko się go czyta, jest okropny. Ciężko coś zmienić, a zazwyczaj jak coś zmienisz to wszystko się wali.
W MVC rozdzielasz odpowiedzialności leżące na tym jednym pliku pomiędzy trzy inne. Każdy z nich dużo krótszy, prostszy nie tylko w formie ale i zrozumieniu. Jest również re-używalny i łatwo można go skalować.
Jeszcze inaczej
Wyobraź sobie jeden plik, w którym na samej górze sprawdzasz adres i na jego podstawie dostarczasz odpowiednią stronę, łączysz się z bazą, pobierasz odpowiednie treści, potem je przerabiasz, zbierasz w zmienne, niżej je wyświetlasz w szablonie HTML... Wielki plik, gdzie masz kod HTML i kod PHP i obsługę (a nawet połączenie) z bazą danych...
Straszny syf, ciężko się czyta. Wielkolud którego ponownie nie użyjesz bez konieczności zmian w kilkudziesięciu miejscach. Lepiej nie dotykać bo się zawali. Jak takie okropne spagetti które ci jeszcze ucieka z talerza.
Z pomocą MVC możesz to uporządkować!
Teraz to kontroler będzie odpowiedzialny za obsłużenie odpowiedniej zakładki. We współpracy z modelem pobierze odpowiednie dane i dostarczy ci je poprzez widok !
Przykład dla strony głównej bloga
Wykonany tutaj proste wyświetlanie strony głównej z wykorzystaniem kontrolera, modelu i widoku .
Jest to przykład oparty na frameworku CodeIgniter.
Kontroler
<?php
class Blog extends CI_Controller {
// Metoda kontrolera odpowiedzalna za zarzadzanie strona glowna
public function strona_glowna()
{
// Wczytujemy nasz model
$this->load->model('Blog_model');
// Pobieramy tresc strony glownej z naszego modelu
$data['tresc'] = $this->Blog_model->daj_tresc_strony_glownej();
// Wyczytujemy nasz widok razem z trescia ktora tam wyswietlimy
$this->load->view('blog', $data);
}
}
Model
class Blog_model extends CI_Model {
// Metoda ta zwroci nam tresc strony glownej
public function daj_tresc_strony_glownej()
{
// Zwracamy tresc strony glownej
return 'To jest strona glowna!';
}
}
Widok
<html>
<head>
<title>Mój Blog</title>
</head>
<body>
<h1><?= $tresc ?></h1>
<!-- Tutaj wyswietlamy tresc strony glownej jako naglowek h1 -->
</body>
</html>
Jak widzisz jest to bardzo proste i logiczne .
Kontroler wszystkim zarządza i komunikuje się z modelem i widokiem. Model dostarcza dane które są następnie odpowiednio prezentowane użytkownikowi za pomocą widoku !
Co to jest kontroler?
Jest to jednostka odpowiedzialna za komunikację z modelem (danymi) i widokami (prezentacja/szablony). Ale pamiętaj - nic innego jak osobny, wyspecjalizowany do tego plik w którym dzieje się cała ta logika.
Co to jest model?
Otóż nic innego jak jednostka (plik) odpowiedzialna za dane. Jest jedynie odpowiedzialna za ich przetwarzanie i dostarczanie. Zazwyczaj model jak już wspomniałem jest odpowiedzialny za komunikację z bazą danych.
Co to jest widok?
Po prostu szablon, plik który ma za zadanie odpowiednio przedstawić dane dostarczone z modelu. Reprezentacja tego co widzi użytkownik.
True MVC
Istnieje wiele implementacji tego wzorca projektowego. Tak samo implementacje MVC między frameworkami PHP różnią się - mniej lub bardziej. Oryginalnie jego architektura wygląda nieco inaczej. Powinna funkcjonować w nieco inny sposób. Na tym podłożu jest bardzo dużo burzliwych dyskusji. Ale o tym opowiem w innym artykule .
W rzeczywistości we frameworkach języka PHP wygląda to właśnie tak jak to wyłożyłem .
HMVC
Wypada tutaj również wspomnieć o rozszerzeniu MVC - HMVC. To jest coś jeszcze ciekawszego !
Hierarchiczny MVC - odmiana wzorca projektowego MVC (a raczej jego rozbudowanie) która pozwala na reorganizację struktury aplikacji i wykorzystanie modułów. Ale to temat na osobny artykuł .
Zalety MVC
Aplikacja która opiera się na wzorcu MVC ma bardzo wiele zalet, należą do nich:
- Oddzielenie logiki od prezentacji
- Przejrzystość aplikacji
- Duża konfigurowalność
- Łatwa skalowalność
- Bardzo dobra architektura
- Intuicyjność i łatwa nawigacja
- Łatwe utrzymanie aplikacji
- Uporządkowanie kodu
- Rozdzielenie odpowiedzialności i zależności
Tak to wygląda
I jest to bardzo piękne. Wzorzec projektowy MVC jest bardzo piękny i sam osobiście jak większość innych osób uważam go za sztukę. I większość jak nie wszystkie frameworki są nim budowane.
Wygląda skomplikowanie choć jak widzisz wcale takie nie jest
To znaczy mam nadzieję że teraz to widzisz. Proszę daj znać w komentarzu jak jest . I na ile pomocny był tobie ten artykuł. Mam nadzieję że wszelkie twoje wątpliwości co do wzorca MVC zostały rozwiane. Jeśli tak - super ! Cieszę się bardzo.
Zapraszam również do przeczytania innych moich artykułów . Jak już wspomniałem zostaw komentarz i jeśli uważasz ten artykuł za cenny i przydatny to proszę udostępnij .
Dziękuję za lekturę i życzę ci dobrego dnia . Bywaj!