Aby utworzyć nowy projekt należy wcześniej pobrać i rozpakować Zend Framework.
Najprostszym sposobem pobrania Zend Framework razem z całym środowiskiem PHP jest zainstalowanie Zend Server. Zend Server zawiera instalatory dla Mac OS X, Windows, Fedora Core oraz Ubuntu. Oprócz tego dostępna jest uniwersalna paczka instalacyjna kompatybilna z większością dystrybucji Linux.
Po zainstalowaniu Zend Server, pliki frameworka są dostępne w katalogu
/usr/local/zend/share/ZendFramework dla Mac OS X oraz Linux,
lub C:\Program Files\Zend\ZendServer\share\ZendFramework dla
Windows. Zmienna include_path będzie automatycznie ustawiona
tak aby obejmowała Zend Framework.
Alternatywnie można pobrać najnowszą wersję Zend Framework i rozpakować zawartość do dowolnego katalogu; należy zapamiętać wybraną lokalizację instalacji.
Opcjonalnie w pliku php.ini można umieścić w
zmiennej include_path ścieżkę do
podkatalogu library/ znajdującego się w pobranym archiwum.
Instalacja zakończona! Zend Framework jest zainstalowany i gotowy do użycia.
Narzędzie wiersza poleceń zf
W katalogu instalacji Zend Framework znajduje się podkatalog
bin/.
Zawiera on skrypty zf.sh oraz zf.bat
odpowiednio dla użytkowników Unix oraz Windows. Należy zapamiętać ścieżkę dostępu
do tych skryptów.
Jeśli w dokumentacji pojawią się odniesienia do komendy zf, proszę pamiętać o zastąpieniu ich pełną ścieżką dostępu do odpowiedniego skryptu. Dla systemów Unix można skorzystać z polecenia alias: alias zf.sh=path/to/ZendFramework/bin/zf.sh.
W przypadku problemów z konfiguracją narzędzia wiersza poleceń proszę zapoznać się z jego instrukcją.
Aby utworzyć nowy projekt należy otworzyć terminal (dla Windows - wiersz polecenia Start -> Run i polecenie cmd). Należy przejść do katalogu nowego projektu. Następnie, używając ścieżki do odpowiedniego skryptu, należy wywołać następujące polecenie:
% zf create project quickstart
Wywołanie tego polecenia spowoduje utworzenie podstawowej struktury katalogów, razem z początkowymi kontrolerami i widokami. Drzewo katalogów powinno wyglądać podobnie do poniższego:
quickstart
|-- application
| |-- Bootstrap.php
| |-- configs
| | `-- application.ini
| |-- controllers
| | |-- ErrorController.php
| | `-- IndexController.php
| |-- models
| `-- views
| |-- helpers
| `-- scripts
| |-- error
| | `-- error.phtml
| `-- index
| `-- index.phtml
|-- library
|-- public
| |-- .htaccess
| `-- index.php
`-- tests
|-- application
| `-- bootstrap.php
|-- library
| `-- bootstrap.php
`-- phpunit.xml
W tym momencie, jeśli Zend Framework nie jest umieszczony w zmiennej
include_path, zaleca się skopiowanie lub umieszczenie
linku symbolicznego do podkatalogu library/ projektu.
Najistotniejsze jest aby zawartość katalogu library/Zend/
instalacji Zend Framework była dostępna w katalogu library/
projektu. Na systemach Unix można tego dokonać za pomocą następujących poleceń:
# Symlink: % cd library; ln -s path/to/ZendFramework/library/Zend . # Kopia: % cd library; cp -r path/to/ZendFramework/library/Zend .
W systemach Windows najprostszym rozwiązaniem będzie wykonanie tego z poziomu Explorera.
Teraz, kiedy nowy projekt jest utworzony należy zapoznać się z podstawowymi założeniami: bootstrapem, konfiguracją, kontrolerami oraz widokami.
Klasa Bootstrap definiuje zasoby i komponenty do inicjalizacji.
Domyślnie uruchamiany jest kontroler frontowy
ze standardowym katalogiem w którym szukane są kontrolery akcji (o których mowa później)
ustawionym na application/controllers/. Klasa przedstawia się
następująco:
// application/Bootstrap.php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
}
Jak widać, na początek wymagane jest niewiele.
Sam Zend Framework nie wymaga konfiguracji ale tworzona aplikacja - najczęściej tak.
Standardowo plik konfiguracyjny umieszczony jest w
application/configs/application.ini. Zawiera on podstawowe
instrukcje ustawienia środowiska PHP
(np. włączanie/wyłączanie raportowania błędów),
wskazanie ścieżki i klasy Bootstrap oraz ścieżkę do katalogu
kontrolerów akcji. Domyślny plik wygląda następująco:
; application/configs/application.ini [production] phpSettings.display_startup_errors = 0 phpSettings.display_errors = 0 includePaths.library = APPLICATION_PATH "/../library" bootstrap.path = APPLICATION_PATH "/Bootstrap.php" bootstrap.class = "Bootstrap" appnamespace = "Application" resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers" resources.frontController.params.displayExceptions = 0 [staging : production] [testing : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1 [development : production] phpSettings.display_startup_errors = 1 phpSettings.display_errors = 1
Należy zwrócić uwagę na kilka cech tego pliku. Po pierwsze, używając konfiguracji
w pliku INI, można bezpośrednio używać stałych;
APPLICATION_PATH to stała PHP (opisana później).
Dodatkowo, zdefiniowane zostały oddzielne sekcje:
production, staging, testing oraz development. Ostatnie trzy dziedziczą ustawienia ze
środowiska produkcyjnego (production). Podany sposób stanowi użyteczny przykład
organizacji konfiguracji, dzięki której odpowiednie ustawienia są dostępne w
odpowiednim momencie cyklu rozwoju oprogramowania.
Zawarte w aplikacji kontrolery akcji przechowują ścieżki działania programu i odwzorowują żądania na odpowiednie modele i widoki.
Kontroler akcji powinien posiadać co najmniej jedną metodę o nazwie zakończonej na
"Action". Te metody stają się dostępne dla użytkowników. Domyślnie URLe w Zend
Framework stosują schemat /kontroler/akcja, gdzie
"kontroler" jest odwzorowany na nazwę kontrolera akcji
(z pominięciem sufiksu "Controller")
a "akcja" jest odwzorowana na metodę w tym kontrolerze
(z pominięciem sufiksu "Action").
W typowym projekcie niezbędny jest kontroler IndexController,
który jest początkowym punktem odniesienia i stanowi stronę początkową aplikacji,
oraz ErrorController czyli kontroler obsługujący błędy
HTTP 404 (brak kontrolera i/lub akcji) lub
HTTP 500 (błąd aplikacji).
Domyślnie IndexController wygląda następująco:
// application/controllers/IndexController.php
class IndexController extends Zend_Controller_Action
{
public function init()
{
/* Inicjalizacja kontrolera akcji */
}
public function indexAction()
{
// ciało akcji
}
}
Domyślny ErrorController przedstawia się jak poniżej:
// application/controllers/ErrorController.php
class ErrorController extends Zend_Controller_Action
{
public function errorAction()
{
$errors = $this->_getParam('error_handler');
switch ($errors->type) {
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
// błąd 404 -- brak kontrolera i/lub akcji
$this->getResponse()->setHttpResponseCode(404);
$this->view->message = 'Page not found';
break;
default:
// błąd aplikacji
$this->getResponse()->setHttpResponseCode(500);
$this->view->message = 'Application error';
break;
}
$this->view->exception = $errors->exception;
$this->view->request = $errors->request;
}
}
Należy zwrócić uwagę, iż IndexController nie zawiera żadnego
kodu oraz ErrorController odnosi się do właściwości "view". To
prowadzi do następnego tematu.
Widoki (view scripts) w Zend Framework są napisane w starym dobrym
PHP. Domyślnie
znajdują się w application/views/scripts/, gdzie są w dalszym
stopniu dzielone wg kontrolerów do których należą. W obecnym przypadku istnieją
dwa kontrolery: IndexController oraz
ErrorController. Oznacza to, że w katalogu widoków powinny się
znaleźć dwa podkatalogi: index/ oraz error/.
W nich należy umieścić skrypty widoków odpowiednie dla każdej z akcji danego kontrolera.
Domyślnie tworzone są skrypty index/index.phtml oraz
error/error.phtml.
Skrypty widoków mogą zawierać dowolny kod HTML
i używać <?php jako tagów
otwarcia i ?> jako tagów zamknięcia dla poleceń PHP.
Domyślnie skrypt index/index.phtml zawiera następującą zawartość:
<!-- application/views/scripts/index/index.phtml -->
<style>
a:link,
a:visited
{
color: #0398CA;
}
span#zf-name
{
color: #91BE3F;
}
div#welcome
{
color: #FFFFFF;
background-image: url(http://framework.zend.com/images/bkg_header.jpg);
width: 600px;
height: 400px;
border: 2px solid #444444;
overflow: hidden;
text-align: center;
}
div#more-information
{
background-image: url(http://framework.zend.com/images/bkg_body-bottom.gif);
height: 100%;
}
</style>
<div id="welcome">
<h1>Welcome to the <span id="zf-name">Zend Framework!</span><h1 />
<h3>This is your project's main page<h3 />
<div id="more-information">
<p>
<img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" />
</p>
<p>
Helpful Links: <br />
<a href="http://framework.zend.com/">Zend Framework Website</a> |
<a href="http://framework.zend.com/manual/en/">Zend Framework
Manual</a>
</p>
</div>
</div>
Skrypt error/error.phtml jest nieco bardziej interesujący - używa
instrukcji warunkowych PHP:
<!-- application/views/scripts/error/error.phtml -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Zend Framework Default Application</title>
</head>
<body>
<h1>An error occurred</h1>
<h2><?php echo $this->message ?></h2>
<?php if ('development' == $this->env): ?>
<h3>Exception information:</h3>
<p>
<b>Message:</b> <?php echo $this->exception->getMessage() ?>
</p>
<h3>Stack trace:</h3>
<pre><?php echo $this->exception->getTraceAsString() ?>
</pre>
<h3>Request Parameters:</h3>
<pre><?php echo var_export($this->request->getParams(), 1) ?>
</pre>
<?php endif ?>
</body>
</html>
Na potrzeby tego wprowadzenia, założono użycie web serwera Apache. Zend Framework działa równie dobrze z innymi serwerami - włączając Microsoft Internet Information Services, lighttpd, nginx i wiele innych. Większość programistów jednak jest najbardziej zaznajomiona z Apache, który ułatwia zrozumienie struktury katalogów Zend Framework i posiada szerokie możliwości przepisywania linków (mod_rewrite).
Aby utworzyć wirtualnego hosta należy odnaleźć plik httpd.conf oraz
ewentualne pozostałe pliki konfiguracyjne serwera. Popularne katalogi:
-
/etc/httpd/httpd.conf(Fedora, RHEL i inne) -
/etc/apache2/httpd.conf(Debian, Ubuntu i inne) -
/usr/local/zend/etc/httpd.conf(Zend Server na maszynach *nix) -
C:\Program Files\Zend\Apache2\conf(Zend Server na maszynach Windows)
W pliku httpd.conf (lub httpd-vhosts.conf
dla niektórych systemów) należy dokonać dwóch zmian. Po pierwsze - upewnić się, że
jest zainicjowana zmienna NameVirtualHost; Typowe ustawienie to
"*:80". Po drugie - zdefiniować wirtualnego hosta:
<VirtualHost *:80>
ServerName quickstart.local
DocumentRoot /sciezka/do/quickstart/public
SetEnv APPLICATION_ENV "development"
<Directory /sciezka/do/quickstart/public>
DirectoryIndex index.php
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Należy zwrócić uwagę na kilka szczegółów. Po pierwsze, DocumentRoot
wskazuje na podkatalog projektu o nazwie public. To oznacza, że
jedynie pliki znajdujące się w tym podkatalogu mogą być zwracane przez serwer
bezpośrednio. Po drugie, instrukcje AllowOverride,
Order oraz Allow umożliwiają stosowanie plików
htacess w projekcie. W środowisku programistycznym (development)
jest to uznawane za dobrą praktykę ponieważ eliminuje potrzebę resetowania
serwera po każdej zmianie instrukcji konfiguracyjnych. Jednak w środowisku produkcyjnym
(production), zalecane jest przeniesienie zawartości pliku htaccess
do głównego pliku konfiguracyjnego serwera oraz wyłączenie obsługi
htaccess. Po trzecie, instrukcja
SetEnv pozwala zainicjować zmienną środowiskową oraz
przekazać ją do PHP i index.php.
Dzięki temu stanie się ona podstawą stałej
APPLICATION_ENV aplikacji Zend Framework.
W środowisku produkcyjnym można ją ustawić na "production" lub zrezygnować
z tej instrukcji ("production" jest domyślną wartością stałej
APPLICATION_ENV).
Na koniec należy dodać wpis w pliku hosts odnoszący się do wartości
ServerName. Na systemach *nix jest to zazwyczaj
/etc/hosts. Na maszynach Windows typową lokalizacją jest
C:\WINDOWS\system32\drivers\etc. Wpis powinien być podobny do:
127.0.0.1 quickstart.local
Po uruchomieniu webserwera (lub restarcie) projekt powinien być gotowy do użytku.