Devloger

MVC – Co to jest? Na czym polega? Jak działa?

MVC | Model-View-Controller

Model, Widok, Kontroler logo

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 Emotikon uśmiechniętej buźki.

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 Emotikon uśmiechniętej buźki (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ę Emotikon uśmiechniętej buźki.

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.

Model wzorca MVC

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 Emotikon uśmiechniętej buźki!

Przykład dla strony głównej bloga

Wykonany tutaj proste wyświetlanie strony głównej z wykorzystaniem kontrolera, modelu i widoku Emotikon uśmiechniętej buźki.

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 Emotikon uśmiechniętej buźki.

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 Emotikon uśmiechniętej buźki!

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 Emotikon uśmiechniętej buźki.

Oryginalny wzorzec MVC

W rzeczywistości we frameworkach języka PHP wygląda to właśnie tak jak to wyłożyłem Emotikon uśmiechniętej buźki.

HMVC

Wypada tutaj również wspomnieć o rozszerzeniu MVC - HMVC. To jest coś jeszcze ciekawszego Emotikon uśmiechniętej buźki!

Hierarchiczny MVC

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ł Emotikon uśmiechniętej buźki.

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 Emotikon uśmiechniętej buźki. 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 Emotikon uśmiechniętej buźki! Cieszę się bardzo.

Zapraszam również do przeczytania innych moich artykułów Emotikon uśmiechniętej buźki. Jak już wspomniałem zostaw komentarz i jeśli uważasz ten artykuł za cenny i przydatny to proszę udostępnij Emotikon uśmiechniętej buźki.

Dziękuję za lekturę i życzę ci dobrego dnia Emotikon uśmiechniętej buźki. Bywaj!

Krystian Bogucki

Podobał Ci się ten artykuł?

Jeśli tak, to zarejestruj się aby otrzymywać powiadomienia o nowych artykułach. Nie ujawnię nikomu Twojego adresu!

7 komentarzy... przeczytaj komentarze albo dodaj nowy komentarz


Grzegorz

2019-03-19

Cześć, myślę, że super opcją byłoby, gdybyś dodał wyszukiwarkę na stronę. Dopiero się wgłębiam w powyższy temat i kiedy nie jestem pewien jakieś frazy, chciałbym ją odszukać u Ciebie na stronie i przejrzeć definicję. Tymczasem muszę się odnosić do Google. Pozdrawiam!!!

Devloger

2019-03-21

Rozumiem ciebie Grzegorzu, dziękuję ci za tę sugestię. Jednak na razie w ramach przeglądania zasobów strony polecam korzystać z mojego spisu treści. Znajduje się na górze strony w nawigacji. Po przejściu do niego możesz łatwo dokonywać przeszukiwania po tytułach wybierając na klawiaturze CTRL+F :). Pozdrawiam.

Mariola

2019-06-21

Bardzo dobry artykuł. Prosto jasno i bez żadnej dodatkowej filozofii, napisany językiem "prościej się nie da" :) Dobrze się go czytało. Pozdrawiam.

Devloger

2019-06-26

Dzięki! Cieszę się, że tak uważasz Mariolu :). Wszystkiego dobrego!

Tomasz

2019-12-06

Właśnie czegoś takiego szukałem. Podstawowych informacji podanych w spójny i uporządkowany sposób. Pozdrawiam.

Gabi

2020-04-23

Dzień dobry, Czemu tak bardzo nie lubi pan spaghetti?

Devloger

2020-06-28

@Gabi spaghetti jest dobre, ale nie w kodzie :D.