Instalacja Zend Framework - podstawy

Artykuł dodany: 12 czerwca 2008. Ostatnia modyfikacja: 12 sierpnia 2009.

Stopień trudności (1 - dla początkujących, 5 - dla ekspertów): 1

Zacznijmy od najważniejszego. Zend Framework ma budowę modułową co oznacza, że poszczególne komponenty możemy stosować niezależnie, w zależności od aktualnych potrzeb. Na dobrą sprawę nie musimy nawet przegrywać całego folderu library/Zend – wystarczą nam tylko klasy oraz klasy zależne (wczytywane funkcją require/require_once w plikach frameworka) które mamy zamiar wykorzystać w swoim projekcie. ZF nie instalujemy w typowo rozumiany sposób – nie odpalamy przykładowego pliku install.php, nie podajemy danych użytkownika dla połączenia z bazą itp, jak miałoby to miejsce w przypadku instalacji sklepu internetowego czy bloga. Układ plików, nazewnictwo klas zależą od wyrobionych nawyków i koncepcji tak więc tekst ten może jedynie sugerować a nie narzucać pewne rozwiązania.

Jednym z najważniejszych zadań jakie powinniśmy sobie postawić przed utworzeniem nowego projektu jest opracowanie struktury katalogowej. Jest to o tyle ważne że w późniejszym etapie pozwoli uniknąć zbędnego przerzucania plików i zmian ścieżek oraz umożliwi łatwe przenoszenie całego wzoru do nowych projektów. Na stronach wiki możemy znaleźć kilka przykładowych rozwiązań.

Klasyczny styl uniksowy

/application
    /etc
    /lib
        /Zend
        /(inne biblioteki)
    /usr
        /controllers
        /models
        /views
    /var
        /sessions
        /cache
        /view_compiles
/htdocs
    /images
    /scripts
    /styles

Konwencjonalny

/application
    /config
    /controllers
    /models
    /views
/htdocs
    /images
    /scripts
    /styles
    index.php
/library
    /Zend
    /(inne biblioteki)
/tmp
    /sessions
    /cache
    /view_compiles

Konwencjonalny modułowy

/application
    /config (opcjonalnie)
    /(module 1)
        /config (opcjonalnie)
        /controllers
        /models
        /views
    /(module 2)
        /controllers
        /models
        /views
    /(module n)
        /controllers
        /models
        /views
/htdocs
    /images
    /scripts
    /styles
    index.php
/library
    /Zend
    /(inne biblioteki)
/tmp
    /sessions
    /cache
    /view_compiles

Najważniejsze co możemy zauważyć jest to, że żadna z bibliotek, modułów czy plików tymczasowych nie znajduje się w katalogu dostępnym z poziomu zwykłego użytkownika www. Jest to bardzo ważne ze względów bezpieczeństwa. Dodatkowo po przegraniu wszystkich plików powinniśmy zadbać o nadanie plikom odpowiednich uprawnień. W systemie uniksowym jeżeli masz dostęp przez SSH wykonaj przykładowo polecenie “chmod 700 library/ -R” (więcej o chmod możesz znaleźć chociażby na polskiej wikipedii. Nadawanie uprawnień oferuje także dowolny klient FTP z tym że oczywiście cała czynność potrwa znacznie dłużej.

Gdy uporaliśmy się już ze strukturą katalogową pora wczytać pliki frameworka. Powinniśmy ustalić dodatkową ścieżkę wyszukiwania zawierającą biblioteki ZF. Można to wykonać dwojako:

set_include_path('../library/');
ini_set('include_path', '../library/');

gdzie oczywiście ‘..library/’ zależy od utworzonej wcześniej struktury katalogowej. Zobacz również dokumentację php – funkcja set_include_path. Bardziej zaawansowany kod może również uwzględniać już istniejące ustawienia:

ini_set('include_path', ini_get('include_path').PATH_SEPARATOR.'../library/');

PATH_SEPARATOR to stała zawierająca odpowiedni dla danego systemu (: pod linuksem, ; pod windowsem) separator.

Pora sprawdzić czy wszystko działa. Wczytajmy przykładową klasę.

require_once 'Zend/Mail.php';
$mail = new Zend_Mail();

Brak błędu oznacza oczywiście poprawną konfigurację. Jeżeli jednak coś poszło nie tak przeczytaj uważnie wszystkie komunikaty i postaraj się je poprawić.

Tyle jeżeli chodzi o podstawową konfigurację w przypadku wykorzystywania pojedynczych komponentów. Dla modelu MVC możesz również dodać reguły przepisywania:

Apache

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]

Lighttpd

url.rewrite-once = (
   ".*\?(.*)$" => "/index.php?$1",
   ".*\.(js|ico|gif|jpg|png|css)$" => "$0",
   "" => "/index.php"
)

IIS

RewriteRule ^[\w/\%]*(?:\.(?!(?:js|ico|gif|jpg|png|css|html)$)[\w\%]*$)? /index.php [I]

Oczywiście nie oznacza to że musisz je stosować. Zend Framework jest projektem mającym wspomagać proces projektowania aplikacji a nie narzucającym określone rozwiązania. Tak więc oba poniższe linki będą poprawne:

http://localhost/galeria/dodajzdjecie
http://localhost/index.php/galeria/dodajzdjecie

Wczytywanie klas można wykonywać również w sposób automatyczny poprzez Zend_Loader a konkretnie statyczną metodę Zend_Loader::registerAutoload(). Na poniższym przykładzie:

<?php
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();

$mail = new Zend_Mail();
$config = new Zend_Config_Ini();

Nazwy Zend_Mail i Zend_Config_Ini zostaną automatycznie przekonwertowane na Zend/Mail.php oraz Zend/Config/Ini.php a pliki te wczytane. Metoda ta zadziała również dla naszych klas należy tylko pamiętać o konwencji nazewniczej (oraz że w systemach uniksowych wielkość liter ma znaczenie. `Przyklad` to zupełnie inny katalog niż `przyklad`).

Od wersji 1.8 nastąpiła drobna zmiana w działaniu autoloadera. Odpowiednikiem powyższego kodu jest:

require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);

Na końcu chciałbym jeszcze zwrócić uwagę na “bootstraping”. Dzięki przepisywaniu URLi wszystkie żądania kierowane do aplikacji powinny przechodzić przez jeden plik którym będzie zazwyczaj index.php. Jego zadaniem będzie wczytanie konfiguracji, wykonanie połączeń – ogólnie przetworzenie całości. Z powodu wymienionych wcześniej względów bezpieczeństwa dobrze by było umieścić wszystkie kluczowe pliki poza strukturą katalogową dostępną z poziomu www a plik index.php dostępny dla klienta (np. przeglądarki), występujący na tym samym poziomie co zdjęcia, CSS, JS niech zajmuje się tylko uruchomieniem aplikacji właściwej. Końcowy przykład naszego projektu może wyglądać następująco:

Struktura katalogowa według modelu konwencjonalnego

/application
    /config
    /controllers
    /models
    /views
    bootstrap.php
/htdocs <- katalog publiczny, występuje również pod nazwami www, public_html
    /images
    /scripts
    /styles
    index.php
/library
    /Zend
    /(inne biblioteki)
/tmp
    /sessions
    /cache
    /view_compiles

Plik index.php

require_once '../application/bootstrap.php';

Plik bootstrap.php

<?php

ini_set('include_path', '../library/');
require_once('Zend/...');
//...dalsze przetwarzanie aplikacji

Albo według innego modelu:

Plik index.php

require_once('../application/bootstrap.php');
Bootstrap::run();

Plik bootstrap.php

class Bootstrap {

    public static function run() {
      self::setupEnvironment();
      self::loadMod();
      itd...
    }

}

Od wersji 1.8 wprowadzono Zend_Application który jest odpowiednikiem modelu drugiego.

Komentarze

Nie ma jeszcze żadnych komentarzy do wyświetlenia. Może chcesz zostać pierwszą osobą która podzieli się swoją opinią?

Dodaj komentarz

*
Nazwa zostanie wyświetlona wraz z komentarzem. Możesz też utworzyć nowe konto w serwisie, dzięki czemu uzyskasz dodatkową funkcjonalność.
*
Akceptowana jest ograniczona składnia Textile. Wszystkie tagi HTML zostaną usunięte.