Zend Framework - wprowadzenie

2010-09-30 , Papiewski Łukasz , Programowanie / Kodzenie

Zend jest szkieletem zawierającym narzędzia, zdefiniowane struktury, czy komponenty wspomagająca tworzenie, rozwój i testowanie aplikacji. Wykorzystuje (stosowany sukcesywnie także w innych frameworkach) wzorzec projektowy MVC (ang. Model-View-Controller). Model-View-Controller zakłada podział aplikacji na trzy główne warstwy:

  • Model - jest pewną reprezentacją problemu bądź logiki aplikacji.
  • Widok - opisuje, jak wyświetlić pewną część modelu w ramach interfejsu użytkownika. Może składać się z podwidoków odpowiedzialnych za mniejsze części interfejsu.
  • Kontroler - przyjmuje dane wejściowe od użytkownika i reaguje na jego poczynania, zarządzając aktualizacje modelu oraz odświeżenie widoków.

W przypadku ZF model oznacza bazę danych i wszystkie zagadnienia z nią związane, widok jest warstwą prezentacyjną skupiającą przede wszystkim kod HTML, a kontroler zarządza zapytaniami użytkownika i zwraca odpowiedni model do odpowiedniego widoku.

Widok jest obiektem wykorzystującym plik o nazwie będącej nazwą funkcji kontrolera. Plik ten znajduję się w podkatalogu views/scripts o nazwie takiej samej jak nazwa kontrolera (zob. (zob. updatescript)).

Jako jeden z elementów narzucających pewną jednolitą strukturę wprowadzono mechanizm modułowy. Moduł to podaplikacja ze standardową strukturą katalogów taką jak w głównej aplikacji. Wszystkie pliki modułu znajdują się w appication/modules w katalogu z odpowiednią nazwą. Tym samym moduł umożliwia wygodne dodawanie lub usuwanie do innego projektu poprzez zwyczajne skopiowanie lub usunięcie katalogu. Wszelka potrzebna konfiguracja jest umieszczana w pliku Bootstrap.php (podobnie jak w aplikacji głównej).

Jednym z elementów globalnych dla całej aplikacji jest plugin. Jest to klasa (obiekt) wykonywający pewne krytyczne czynności jeszcze przed wykonaniem funkcji kontrolera. Przykładowo plugin rozszerzający standardową klasę Zend_Acl umożliwia kontrolowanie poziomu dostępu.

Inne zaawansowane funkcje to np. kontrola trasy - routing, pozwalająca na ustawienie własnych reguł adresowanie poszczególnych akcji kontrolera.

Do jednych z podstawowych i często wykorzystywanych należy klasa Zend_Form, która znacznie upraszcza budowanie formularzy i ich obsługę.

Cały framework zawiera ciągle rosnącą liczbę użytecznych klas (np. XML_Parser, AJAX, Lucene Search) będących zbiorami (wrappers) na istniejące podstawowe funkcje lub powszechne rozwiązania PHP.

Wymagane i opcjonalne klasy przedstawiono na rysunkupic-zend.

Klasy PHP narzędzia Zend. Jest tu przedstawiona droga (Zend_Route) od zapytania do uzyskania odpowiedniego widoku. Na początku są aktywowane kontrolery główne, następnie kontroler odpowiedzialny za odpowiednią akcję. Przy konstruowaniu widoku może być wykorzystany zestaw dodatkowych klas i komponentów. Biblioteka komponentów składa się z różnorakich klas odpowiedzialnych np. za generowanie danych, współpracę z bazą danych, sesję użytkownika, czy inne odpowiedzialne za wiadomości e-mail lub powiadomienia RSS. Źródło: na podstawie informacji na stronie zendframework.com. pic-zend

Uzasadnienie wyboru

Programiści PHP dość długo wykorzystywali strukturalny model programowania jaki oferuje ten skryptowy język. Mimo tego, że w wersji 3 i 4 PHP istniało pojęcie klasy i obiektu to było traktowane jako zwykły typ (przez co stosowanie klas było mało wydajne - nie było referencji). Wraz z ciągle rozwijającymi się wersjami PHP została dodana możliwość wydajniejszego programowania obiektowego. Od wersji 5 język PHP oferuję szerszy i wydajniejszy zakres takiego wsparcia.

Biorąc pod uwagę wcześniejsze innowacyjne i sukcesywnie wprowadzone techniki programowania oparte o obiektową strukturę danych (np. w języku Java, takie jak mapowanie obiektowo-relacyjne), możliwa stała się ich implementacja także w PHP. Dzięki odpowiednim zabiegom programistycznym uzyskać można prostą i intuicyjną reprezentację klasy odzwierciedlającą np. tabelę bazy danych. Takie m.in rozwiązanie zostało zaimplementowane w warstwie modelu w Zend Framework, umożliwiając łatwe operowanie tablicami bazy danych (informując tym samym o przeznaczeniu i ułatwiając same mechanizmy współpracy z bazą). Ten same zasady zostały wykorzystany do budowy warstwy kontrolera oraz widoku.

Uproszczenie samego procesu zarządzania projektem (a zwłaszcza bardzo rozbudowanego) stanowi istotę ZF. Dodatkowo sprawia, że raz napisany kod może być łatwo wykorzystany w następnych rozwiązaniach lub łatwo modyfikowany przez osoby trzecie. Zend wprowadza też zespół reguł i dobrych nawyków dotyczących nazewnictwa klas, czy dokumentacji.

Szkieletu projektu

zend-dir

Przed rozpoczęciem prazy z Zend Framework należy pobrać go ze strony zendframework.com. Minimalny pakiet (ok. 4MB) zawiera wszystkie potrzebne klasy PHP. Po rozpakowaniu można przystąpić do utworzenia nowego projektu. W pierwszej kolejności należy umieścić katalog bin w zmiennej $PATH.

W katalogu tym znajduję się skrypt BASH zf.sh wykonujący czynności automatycznego tworzenia i zarządzania projektem. Bazuje on na klasie PHP znajdującej się w pliku zf.php w tym samym katalogu. Wymaga to w związku z tym posiadania parsera tego języka na komputerze.

Poniżej umieszczona jest lista zmiennych, dodanych dla potrzeb organizacji pracy:

PROJECT_NAME=skel
ZEND_PATH=/path/to/zend
NEW_PROJECT=/path/to/project
ZEND_LIB=$ZEND_PATH/library
ZEND_BIN=$ZEND_PATH/bin
PATH=$PATH:$ZEND_BIN

ZEND_PATH to zmienna do rozpakowanego pliku z Zend Framework. Zmienna ZEND_BIN wskazuje na położenie skryptu wykonywalnego zf.sh. Kolejna linijka umieszcza w zmiennej PATH poprzednio zdefiniowaną lokalizację. Umożliwia to wykonanie skryptu podając jego nazwę z dowolnego miejsca nowego projektu.

Poniżej znajduję się sekwencja inicjowania projektu, pozwalająca na utworzenie wymaganego drzewa katalogów i ustawienie odpowiednich linków do katalogów z biblioteką Zend.

mkdir -p $NEW_PROJECT && cd $NEW_PROJECT
zf create project $PROJECT_NAME
ln -s $ZEND_LIB/Zend library/Zend
zf create layout

Pierwsza linijka oznacza przejście do nowo dodanego katalogu z projektem, który jest określony obraną dowolnie wcześniej zmienną NEW_PROJECT. W drugiej linijce znajduję się komenda wywołująca program zf (alias do zf.php) z parametrami, które określają polecenie dodania nowego projektu o nazwie $PROJECT_NAME.

Poniżej praca ze skryptem zf.sh ukazująca podstawowe komendy do zarządzania modelem, widokiem oraz kontrolerem.

$ zf create model Person
Creating a model at /home/papi/web/zend/new/application/models/Person.php
Updating project profile '/home/papi/web/zend/new/.zfproject.xml'

[papi ~/web/zend/new]$ zf create controller Person
Creating a controller at 
/home/papi/web/zend/new/application/controllers/PersonController.php
Creating an index action method in controller Person
Creating a view script for the index action method at 
/home/papi/web/zend/new/application/views/scripts/person/index.phtml
Creating a controller test file at 
/home/papi/web/zend/new/tests/application/controllers/PersonControllerTest.php
Updating project profile '/home/papi/web/zend/new/.zfproject.xml'
Przykład zarządzania projektem Zend Framework

Pierwsza komenda dodaje model o nazwie Person. Automatycznie dodawane są odpowiednie katalogi oraz pliki. Nazwa kontrolera przyjmuję postać PersonController. Zaktualizowany zostaje wewnętrzny plik konfiguracyjny projektu oraz dodatkowo dodane są klasy wykorzystywane do ewentualnego testowania.

Konfiguracja serwera WWW

Po umieszczeniu projektu na serwerze zalecane jest dodatkowe dodanie wpisu wirtualnego adresu (Virtual Host). W przypadku Apache'a należy dodać do odpowiedniego pliku konfiguracyjnego serwera sekwencję przypisującą wybranemu adresowi WWW odpowiedni katalog projektu.

caption=apache.conf
<VirtualHost *:80>
ServerName zend.localhost
DocumentRoot /path/to/project
 
SetEnv APPLICATION_ENV "development"
 
<Directory /path/to/project/public>
DirectoryIndex index.php
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

W zależności od wersji systemu lub dystrybucji najbezpieczniej umieścić ten wpis w głównym pliku o nazwie apache.conf lub httpd.conf, rezydującym najczęściej w katalogu /etc/apache2 lub /etc/httpd.conf. Szczegółowy opis znaleźć można w dokumentacji danej dystrybucji lub wersji serwera.

W ramach testów w przypadku serwera znajdującego się na np. na komputerze domowym można przypisać adres np. zend.localhost i ustawić lokalną translację nazw DNS (ang. Domain Name System) na adres 127.0.0.1, co pod systemem Linux reprezentowane może być linijką 127.0.0.1 localhost zend.localhost w pliku /etc/hosts.

Po zresetowaniu serwera, w przeglądarce adres http://zend.localhost/person/index wywoła domyślną akcję index na kontrolerze Person. Przy poprawnej konfiguracji powinien ukazać się standardowy widok znajdujący się w person/index.phtml:

View script for controller Person and script/action name index

Cytaty

- Simplicity is the ultimate sophistication. - Leonardo da Vinci,
- Popularny człowiek wzbudza zawiść potężnych - Thufir Hawat o Leto Atrydzie (na Kaladanie),
- Szczęście następuje po smutku, a smutek po szczęściu; człowiek jest naprawdę wolny, gdy przestaje rozróżniać między smutkiem a szczęściem, między dobrem a złem - Aforyzmy buddyjskie.