Porady dotyczące programowania aplikacji internetowych

Przykłady programowania w PHP

Wzorzec programowy typu Model View Controller w PHP

Pobierz PAGEneration z GITHUB https://github.com/AppComIT/PAGEneration

W poniższym artykule przedstawiam prosty wzorzec programowy typu MVC (Model View Controller) w przykładowym projekcie nazwanym PAGEneration, ograniczając się do podstawowych jego funkcji zachowując tym samym prostotę, czytelność i przejrzystość kodu, a z drugiej strony dostarczając kompletne rozwiązanie. Przykład będzie generował jedną stronę na bazie widoku (View) typu XSLT korzystając dodatkowo z pliku XML (Model) do wyświetlanych na niej tekstów.

Flow Chart

Uproszczony schemat blokowy pokazany poniżej będzie stanowił bazę do napisania kodu źródłowego projektu.

Flow Chart prosty MVC

Najpierw korzystając z Apache zostaje uruchomiony główny skrypt PHP.

Kontroler (Controller) będąc podstawową częścią aplikacji integruje dane dostarczane przez Model i wywołuje żądany Widok (View), który z kolei generuje wynik i zwraca go z powrotem do kontrolera a ten wysyła na wyjście otrzymany rezultat. W moim przypadku rezultat czyli wygenerowany kod HTML zostaje wydrukowany w przeglądarce.

Model może być typu: obiekt, tablica, plik XML, wynik pobrany bezpośrednio z bazy danych jak również wywołanie usługi poprzez SOAP itd. Widok natomiast może generować kod HTML, plik PDF, Excel lub inny oczekiwany rezultat.

Cała struktura projektu wygląda następująco:

PAGEneration MVC File Structure

Najpierw przedstawię kod .htaccess, który uaktywni przekierowania (redirect) i uruchomi skrypt Controller/Page/Home.php?l=en podczas wywołania strony

.htaccess

Plik .htaccess będzie oczywiście zapisany w głównym katalogu, w którym dodatkowo znajdą się foldery odpowiadające poszczególnym częścią projektu, czyli:

  • Controller
  • Model
  • View

Controller

Tak jak wcześniej napisałem kontroler jest podstawową częścią aplikacji. Klasa Controller jest zapisana w głównym katalogu i zawiera następujące funkcje (metody):

  • __construct - konstruktor klasy
  • addModel - dodaje model do kontrolera
  • addView - dodaje widok do kontrolera
  • output - generuje rezultat wykorzystując procedurę output zadeklarowaną w widoku

Controller.php

Kolejne pliki kontrolera będą miały następującą postać:

Controller/Autoloader.php

Klasa autoloader zawiera statyczną metodę load wyszukującą i odczytującą automatycznie żądany plik.

Controller/Exception.php

Klasa Exception obsługująca wyjątki pomocna do śledzenia błędów.

Controller/Files.php

Klasa Files zawierająca statyczną metodę read do odczytania zawartości pliku.

Controller/Config.php

Klasa Config zawierająca personalizowane stałe dostosowane od środowiska. W moim przypadku są to:

  • _SYSTEM_FOLDER - ścieżka do projektu na dysku poza $_SERVER["DOCUMENT_ROOT"]
  • _SESSION_NAME - nazwa sesji

Controller/Page/Home.php

Główny plik (strona) projektu wywoływany z .htaccess podzielony na bloki odpowiadające tym w umieszczonym powyżej schemacie blokowym. W odpowiednich miejscach zostały dodane odpowiednie komentarze.

Model

Teraz przejdą do przedstawienia części Model, która w moim przypadku ograniczona jest do klas Model.php i Model/Exception.php oraz zawiera dodatkowo jeden plik Model/xml/translate.xml z tekstami pojawiajacymi się na generowanej stronie. W normalnym środowisku modele mogą być dowolnego typu i dostarczać na przykład informacje pobrane z bazy danych. Opracowując abstrakcyjny i uniwersalny wzorzec modelu można w nim zmieniać sposób dostarczania danych podczas gdy komunikacja z kontrolerem będzie cały czas taka sama. Jako przykład podam sytuacje, w której piszemy aplikacje zarządzającą użytkownikami. W początkowej fazie nie mamy jeszcze gotowych procedur komunikujących się z bazą danych więc wstawiamy kilka przykładowych tekstów do tablicy, którą zapisujemy jako zdefiniowany model respektujący narzucony wzorzec. Kontroler nie wie, czy dostarczane dane są statyczne więc podmiana modelu z punktu widzenia aplikacji nic nie zmienia.

Model.php

W moim przykładzie klasa model deklaruje dwie funkcje add (dodaj) i get (pobierz) oraz jedną zmienną dowolnego typu do przechowywania rezultatów.

Model/Exception.php

Spełnia podobną rolę do analogicznej funkcji obsługujacej wyjątki użytej w kontrolerze.

Model/xml/translate.xml

Przykładowy plik zawierający tłumaczenia użyte na stronie.

View

Ostatnią częścią projektu jest Widok (View) składający się w moim przykładzie z następujących komponentów:

  • ViewAbstract.php - w
  • XSLT.php - właściwa klasa definiująca następujące metody:
    • Exception.php

    View/ViewAbstract.php

    Abstrakcyjny model klasy definiujący niezbędną funkcję output, która będzie nadpisana w klasie rozszerzającej.

    View/XSLT.php

    Najbardziej skomplikowana klasa z tego przykładu zawierająca następujące funkcje:

    • __construct - odczytuje podany plik XSLT i określa, który template ma być parsowany - parametr (match).
    • output - dokonuje transformacji kodu XSLT korzystając w wynikowy HTML.
    • toXML - pomocnicza funkcja opisana w oddzielnym artykule konwertująca tablicę lub obiekt do XML.

    View/Exception.php

    Klasa Exception obsługująca wyjątki pomocna do śledzenia błędów.

    View/xsl/home.xsl

    Teraz pora na przedstawienie pliku XSLT, który zawiera właściwą stronę projektu.

    Michał Luberda - Venezia 2012.05