Mimo że PHP nie jest językiem młodym i parę latek ma już na karku, to nadal głównym sposobem programowana w nim jest nieprzemyślane kodowanie, bez stosowania jakiegokolwiek projektu czy wzorca projektowego. Chociaż PHP od wersji 5 oferuje już bardzo przyzwoite wsparcie dla programowania obiektowego, wciąż można znaleźć wiele projektów niewykorzystujących tych możliwości.
Nierzadkie jest też mieszanie warstwy logiki aplikacji z jej
warstwą prezentacji. Wszytko to szybko prowadzi do olbrzymiego bałaganu w kodzie, co z kolei utrudnia pielęgnację takiego programu – a więc poprawianie błędów, rozwijanie go itp. Rozwiązaniem znanym z innych języków programowania jest stosowanie wzorców projektowych oraz opartych na nich tzw. frameworków.
Framewrok dostarcza szeregu gotowych do użycia i sprawdzonych narzędzi, pozwalających na szybkie i wygodne budowanie aplikacji. W świecie PHP istnieje wiele różnych frameworków – Cacke PHP, Seagull, EZ Framework czy wreszcie Zend Framework. Z artykułu tego dowiesz, się jak rozpocząć swoją przygodę z Zend Frameworkiem. Jest to stosunkowo młody produkt, ale dynamicznie rozwijany i mający wsparcie samego Zenda (firmy odpowiedzialnej za rozwój PHP), co wróży mu świetlaną przyszłość. Dziś zapoznasz się z jednym z wielu elementów frameworka – z kontrolerem.
Instalacja
Przed rozpoczęciem pracy musisz pobrać Zend Frameworka ze strony http://framework.zend.com. W trakcie pisania tego artykułu najnowszą wersją frameworka była wersja 1.0.1, na niej więc się oprzemy. Jednak przykłady tu zawarte powinny bez problemu działać także pod nowszymi wersjami. Po pobraniu pliku z frameworkiem, należy go rozpakować – możesz do tego użyć darmowego programu PowerArchiwer (do pobrania ze strony http://www.powerarchiwer.com) lub WinRara.
Po rozpakowaniu, w katalogach z frameworkiem powinien znajdować się katalog library. To w nim są wszystkie niezbędne skrypty frameworka. Nadszedł czas na przygotowanie drzewa katalogów naszej aplikacji. Spójrz na rysunek 2 – tak powinno wyglądać drzewo katalogów aplikacji pisanej w Zend Frameworku.
Nazwy plików w Zend Framework
Przyjrzyj się dokładnie nazwom klas we frameworku.
Składają się one z elementów rozdzielonych
znakiem podkreślenia (_). A teraz przyjrzyj
się układowi katalogów w katalogu library. Klasa
{stala}Zend_Controller_Action{/stala} znajduje się w katalogu
Zend/Controller w pliku {stala}Action.php{/stala}. Tak więc nazwa
klas jest jednocześnie informacją o położeniu
pliku z klasą. Wystarczy znaki _ podmienić na
/, zaś ostatni człon nazwy odczytać jako nazwę
samego pliku.
Warto też wiedzieć, że Zend_Loader szuka na
podstawie tak skonstruowanych nazw plików na
ścieżce include_path. Nic nie stoi na przeszkodzie,
aby ustalić swój format nazewnictwa zgodny
z formatem frameworka i korzystać z {stala}Zend_Loadera{/stala}
dla własnych klas.
W katalogu application umieszczone zostaną
skrypty aplikacji odpowiedzialne za jej warstwę
logiki, prezentacji, danych etc. W katalogu www
będzie się znajdował główny skrypt aplikacji
– {stala}index.php{/stala} – oraz obrazki i skrypty wykonywane
po stronie przeglądarki, a więc głównie JavaScript.
To ten skrypt powinien być widoczny dla serwera
HTTP – pozostałe katalogi możesz ukryć. Katalog
library to z kolei ten sam katalog, który znajdował
się w archiwum z Zend Frameworkiem.
Przed przystąpieniem do pisania aplikacji trzeba
jeszcze zadbać o odpowiednią zawartość pliku
{stala}.htaccess{/stala}. Zadaniem tego pliku jest takie skonfigurowanie
serwera HTTP, aby wszystkie żądania
pochodzące z przeglądarek internetowych były
przekierowywane do skryptu index.php. Typowa
zawartość tego pliku to:
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$
index.php
php_value include_path \"/ścieżka/do/katalogu/library\"
Konfiguracja ta przekierowuje wszystkie
żądania, poza tymi dotyczącymi obrazków, stylów
i skryptów JS, do skryptu index.php. Dodatkowo ustawiona została ścieżka {stala}include_path{/stala} konfiguracji
PHP, tak aby wskazywała na katalog z frameworkiem.
Na koniec, dla wygody, skonfigurujmy sobie
subdomene dla naszego projektu. Co to nam da?
W adresie przeglądarki będziemy mogli wpisywać
adresy typu:
http://hello.localhost/hello/index
zamiast na przykład takiego:
http://localhost/hello/www/hello/index
W celu odpowiedniego skonfigurowania serwera
Apache musisz odnaleźć jego plik konfiguracyjny
{stala}httpd.conf{/stala}. Dopisz w nim, na przykład na końcu,
następujące linie:
DocumentRoot c:/Strony/Hello/wwwServerName hello.localhost
Teraz musisz jeszcze zmodyfikować plik hosts
systemu Windows, znajdujący się w katalogu
{stala}c:\\WINDOWS\\system32\\drivers\\ets{/stala}. Dodaj w nim
na końcu linię:
127.0.0.1 hello.localhost
Zaczynamy – Witaj świecie
Gdy konfigurację mamy już za sobą, pora
zobaczyć, jak to działa. Całością zarządza skrypt
index.php.
index.php
Typowy skrypt {stala}index.php{/stala} jest bardzo prosty
i składa się z zaledwie kilku linii:
Skrypt ten ustala ścieżkę {stala}include_path{/stala} (jeśli nie
można jej było ustawić z poziomu pliku .htaccess).
Następnie dołącza klasę {stala}Zend_Loader.php{/stala} ułatwiającą
ładowanie innych skryptów, ładuje skrypt {stala}Zend_Controller_Front{/stala} będący głównym kontrolerem w naszej
aplikacji – to on odpowiada za przekierowywanie
żądań do poszczególnych kontrolerów akcji – a następnie
uruchamia główny kontroler, ze wskazaniem,
gdzie znajdują się nasz kontrolery.
Kontrolery aplikacji
Aplikacje webowe pisane z użyciem Zend Frameworka
składają się z tzw. kontrolerów, których kod
wykonywany jest w zależności od żądania przekazanego
w postaci adresu URL. Nasz pierwszy kontroler
będzie wykonywał typowe jak na początek zadanie:
wyświetli napis Witaj świecie.
A oto i on:
Jak widzisz, jest to klasa dziedzicząca po klasie
{stala}Zend_Controller_Action{/stala} (zauważ, że klasa ta jest
dołączona do skryptu za pomocą Zend_Loadera,
dzięki czemu nie musisz znać jej położenia – warto
jednak zapoznać się z ramką Nazwy plików w Zend
Frameworku, która wytłumaczy, w jaki sposób na
podstawie nazwy klasy frameworka można dowiedzieć
się, gdzie klasa ta się znajduje).
Zanim przejdziemy do opisu przykładowego
kontrolera, zapoznajmy się z postacią adresu URL
mającego na celu uruchomienie powyższego kontrolera.
Adres prezentuje się następująco:
http://twojadomena/hello/index
Jak widzisz, w adresie zawarto nazwę kontrolera
– hello. To po tej drugiej pozycji z adresu URL
główny kontroler aplikacji ({stala}Front Controller{/stala}) rozpoznaje
oraz uruchamia poszczególne, stworzone
przez nas kontrolery – tzw. kontrolery akcji. Jeśli
masz problemy ze zrozumieniem, co gdzie się znajduje
w adresie URL, zapoznaj się z rysunkiem 3.
Wszystkie klasy kontrolerów muszą mieć
nazwę zakończoną słowem Controller, tak jak tutaj
{stala}HelloController{/stala}. Dodatkowo kontrolery zawierają
metody zakończone słowem Action, wykonywane
w zależności od adresu URL. Zauważ, że nasz kontroler
posiada jedną metodę – {stala}indexAction{/stala}. Przykładowy
podany wyżej adres URL miał po nazwie
kontrolera nazwę akcji, która ma zostać wykonana
– index. Tak więc powyższy adres nakazuje:
- utworzenie i uruchomienie kontrolera {stala}HelloController{/stala},
- wykonanie jego akcji i{stala}ndexAction{/stala}.
Widok
To jeszcze nie koniec naszej aplikacji. Jak
widzisz, wciąż brak tu naszego komunikatu \”Witaj
świecie\”. Jak więc ma on zostać wyświetlony?
Główny kontroler po wykonaniu kodu naszego
kontrolera poszukuje odpowiadającego mu widoku.
<
p>Standardowo (jeśli programista nie zdefiniuje
innego zachowania) widok ten poszukiwany jest
w katalogu {stala}appliaction/views/scripts{/stala} w podkatalogu
o nazwie kontrolera, a więc hello. Sam widok
zaś znajduje się w pliku o nazwie wykonanej
akcji – w naszym przypadku index – i rozszerzeniu
{stala}.phtml{/stala}. Widok jest tu standardowym kodem
w języku PHP:
Witaj Świecie
Witaj Świecie!
Uruchomienie
Uruchomienie aplikacji sprowadza się do
wpisania odpowiedniego adresu w przeglądarce.
Adres ten zgodnie z wcześniejszą konfiguracją
serwera Apache będzie miał postać:
http://hello.localhost/hello/index
Na rysunku 4 możesz zobaczyć wynik działania
naszego programu.
Przykład 2 – Witaj, nazywasz się Jan Kowalski
Poprzedni przykład był bardzo prosty. Czas na
coś nieco bardziej złożonego. Postarajmy się, żeby
skrypt przywitał nas z imienia i nazwiska. Skrypt
{stala}index.php{/stala} pozostawiamy bez zmian, modyfikujemy
natomiast nasz kontroler {stala}IndexController{/stala}:
_getParam(\'imie\',\'Jan\');
$strNazwisko = $this->_getParam(\'nazwisko\', \'Kowalski\');
$this->view->imie = $strImie;
$this->view->nazwisko = $strNazwisko;
}
}
?>
Jak widzisz, doszła nowa akcja. Zanim przejdziemy
jednak do jej analizy, przyjrzyjmy się jeszcze
zmianom, jakie zaszły w widoku akcji index:
Witaj Świecie
Tym razem nie wyświetlamy tu napisu \”Witaj
świecie\”. Zamiast tego prosimy o podanie imienia
i nazwiska przez osobę odwiedzającą naszą stronę.
Zawartość formularza wysyłamy zaś do kontrolera
hello, do akcji say.
Akcja say, odpowiedzialna jest za zebranie
informacji pochodzących z formularza i przekazanie
ich do swojego widoku. Pamiętaj, powinien on
nosić nazwę {stala}say.phtml{/stala}. Najprostszym sposobem
na pobranie danych pochodzących z formularza
jest skorzystanie z metody {stala}_getParam{/stala}. Metoda ta
przyjmuje dwa parametry:
- nazwę pola z formularza, które nas interesuje,
- drugi parametr jest opcjonalny i przyjmuje
domyślną wartość, jaką ma zwracać metoda
w przypadku, gdy z formularza nie została zwrócona
dana o żadnej nazwie (my za domyślnie
przyjmujemy dane Jan Kowalski).
$strImie = $this->_getParam(\'imie\', \'Jan\');
$strNazwisko = $this->_getParam(\'nazwisko\', \'Kowalski\');
Po pobraniu odpowiednich informacji, mogą
one zostać wysłane do widoku. Na szczęście zadanie
przesłania jakichkolwiek danych do widoku
jest niesamowicie proste, wystarczy zdefiniować
zmienne w obiekcie {stala}$view{/stala}, istniejącym w każdym
kontrolerze.
Obiekt ten jest obiektem widoku,
więc widok będzie miał bezpośredni dostęp do tak
zdefiniowanych zmiennych:
$this->view->imie = $strImie;
$this->view->nazwisko = $strNazwisko;
Ostatnią rzeczą, jaką musimy zrobić, jest widok akcji say – {stala}say.phtml{/stala}:
Witaj Świecie
Witaj! Nazywasz się imie
?> nazwisko ?>
Jest to typowa strona HTML, jednak z fragmentami
bardzo prostego kodu PHP:
Witaj! Nazywasz się imie
?> nazwisko ?>
Zauważ, że zmienne, które są tu wyświetlane,
mają dokładne takie same nazwy, jakie zdefiniowałeś
dla widoku w akcji say kontrolera hello.
Rysunki 5 i 6 pokazują działanie drugiej wersji
programu.
Koniec?
Koniec artykułu, początek zabawy. To, czego się
dowiedziałeś z tego artykułu, to zaledwie wstęp
do tematu. Same kontrolery w Zend Frameworku
oferują o wiele większe możliwości, zaś framework
udostępnia dodatkowo znaczną liczbę bibliotek
ułatwiających takie zadania, jak np. zarządzanie
uprawnieniami użytkowników, dostęp do bazy,
lokalizacja aplikacji, cachowanie, przechowywanie
konfiguracji, obsługa web service\’ów i wiele innych.
Warto bliżej zapoznać się z Zend Frameworkiem,
bo kto wie, czy przyszłość aplikacji tworzonych
w PHP nie należy do niego.