Zend Framework Tutorial


Chris Shiflett jakiś czas temu opublikował w serwisie php|architect tutorial wprowadzający do Zend Framework. Jest on swego rodzaju wstępem do ZF, przeprowadza on przez proces stworzenia prostej aplikacji PHP przy użyciu frameworka. Zapraszam do przeczytania tutoriala w wersji polskiej.

Zend Framework został opublikowany! Chociaż jest on jeszcze we wczesnym stadium rozwoju, to tutorial pokazuje niektóre z najlepszych obecnie dostępnych rozwiązań i prowadzi przez proces budowy prostej aplikacji.

Zend zdecydował się na wczesne opublikowanie frameworka i zaangażowanie do współpracy społeczności użytkowników. Podobnie tutorial, jest napisany aby pokazać framework w takiej postaci w jakiej istnieje obecnie. Z tego względu, że jest on opublikowany w formie elektronicznej będzie on atualizowany wraz z rozwojem frameworka.

Wymagania

Zend Framework wymaga PHP 5. Aby wykorzystać w pełni kod przedstawiony w tym tutorialu, potrzebujesz także serwera Apache, ponieważ przykładowa aplikacja (system zarządzania newsami) używa mod_rewrite.

Kod aplikacji z tego tutoriala jest dostępny do bezpłatnego ściągnięcia, więc możesz go samodzielnie wypróbować. Możesz ściągąć go ze strony Brain Bulb pod adresem http://brainbulb.com/zend-framework-tutorial.tar.gz.

Ściąganie frameworka

Zanim zaczniesz pracę z tutorialem będziesz musiał ściągnąć opublikowaną wersję frameworka. Możesz to zrobić manualnie odwiedzając stronę http://framework.zend.com/download, a następnie ściągając wersję tar.gz lub zip, albo wpisać w linii poleceń:

$ wget http://framework.zend.com/download/tgz
$ tar -xvzf ZendFramework-0.1.2.tar.gz

Zend planuje otwarcie własnego kanału PEAR aby uprościć proces ściągania frameworka.

Gdy już ściągiesz opublikowaną wersję frameworka, znajdź katalog library i umieść go w jakimś wygodnym miejscu. W tym tutorialu zmieniono nazwę tego katalogu na lib aby uzyskać prostą
strukturę katalogów:

app/
    views/
    controllers/
www/
    .htaccess
    index.php
lib/

Katalog www jest głównym katalogiem serwera www, katalogi controllers oraz views są obecnie puste, a katalog lib pochodzi ze ściągnietej wersji frameworka.

Na początek

Pierwszy kompenent jaki chciałbym pokazać to Zend_Controller. Jest on fundamentem aplikacji którą tworzysz, jest częścią frameworka dzięki której Zend Framework jest czymś więcej niż tylko zbiorem komponentów. Jednak zanim użyjesz Zend_Controller będziesz musiał przekierować wszystkie przychodzące żądania do jednego skryptu PHP. Ten tutorial używa do tego mod_rewrite.

Użycie mod_rewrite jest sztuką, ale na szczęście jest bardzo proste. Jeśli nie jesteś obeznany z mod_rewrite oraz z samą konfiguracją serwera Apache, utwórz plik .htaccess w głównym katalogu serwera i dodaj do niego następujące dyrektywy:

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

W przyszłości planowane jest usunięcie zależności od mod_rewrite. Jednak aby przykładowa aplikacja działała z opublikowaną wersją frameworka, ten tutorial używa mod_rewrite.

Jeśli dodasz te dyrektywy bezpośrednio w pliku httpd.conf, będziesz musiał zrestartować serwer www. Jeśli dodałeś w pliku .htaccess, to powinno działać od razu. Możesz to w prosty sposób sprawdzić umieszczając w pliku index.php jakiś charakterystyczny tekst, a następnie wykonując żądanie do jakiejś ścieżki na serwerze np. /foo/bar. Przykładowo gdy adresem aplikacji jest http://example.org/ możesz spróbować otworzyć adres URL http://example.org/foo/bar.

Powinieneś także dodać do dyrektywy include_path ścieżkę do katalogu z bibliotekami frameworka. Możesz to zrobić w pliku php.ini lub możesz po prostu dodać taką dyrektywę do pliku .htaccess:

php_value include_path "/path/to/lib"

Zend

Klasa Zend zawiera kolekcję statycznych metod które są uniwersalne i użyteczne. Jest to jedyna klasa ktorą musisz ręcznie załadować:

PHP:
  1. <?php
  2.  
  3. include 'Zend.php';
  4.  
  5. ?>

Kiedy już załadowałeś plik Zend.php, masz dostęp do wszystkich metod klasy Zend. Ładowanie innych klas jest uproszczone dzięki metodzie loadClass(). Na przykład tak możesz załadować klasę Zend_Controller_Front:

PHP:
  1. <?php
  2.  
  3. include 'Zend.php';
  4.  
  5. Zend::loadClass('Zend_Controller_Front');
  6.  
  7. ?>

Metoda loadclass() bierze pod uwagę ścieżki z dyrektywy include_path, a także zna organizację i strukturę katalogów frameworka. Używam jej do ładowania wszystkich innych klas.


1 2 3 4 5 6

Informacje oraz linki


Inne artykuły
Zend Framework 0.1.4
Przykłady wykorzystania Zend Framework
Polecane
Zend Studio - The premiere PHP IDE

Dodaj komentarz

Poświęć chwilę i wyraź swoją opinię. Możesz użyć niektórych znaczników HTML.

Komentarze czytelników

To miłe, że pofatygowałeś się z przetłumaczeniem tutoriala do Zend Framework. Czytanie tego rodzaju opracaowań jest bardziej przyjazne niż sucha lektura dokumentacji, a czytanie w rodzimym języku to wręcz luksus. Robisz fajną robotę ulatwiajac pierwszy kontakt z tym frameworkiem - mowie tu zarówno o powyższym tekscie, jak i o strone http://zf.naruniec.info/. Tak przy okazji czy to (http://framework.zend.com/developer/changeset/589) tlumaczenie tez jest Twojego autorstwa?

Ciesze się, że się podoba :) Mam nadzieję, że niedługo strona z przykładami się nieco rozwinie. Co do tłumaczenia manuala to jest także mojego autorstwa, jednak przetłumaczonych jest dopiero kilka rozdziałów. Myślę że w lipcu uda się zakończyć prace i możliwe, że wraz z wersją frameworka 0.1.5 ukaże się polski manual.

To by było miłe.

To by było super z tą dokumentacją. Co do arta to dzięki wielkie… jak napisał bigZbig - LUKSUS :D

Mógłbyś to gdzieś jeszcze opublikować, np. tu: http://www.secondrenesans.com/c18.html

Nice. Tylko jak najlepiej zabrać się za napisanie strony, która wyświetli jednocześnie generowane menu, skrót ostatnich wpisów z forum itp. oprócz newsów?

Gratuluję, świetny tutorial, naprawdę.

Dołączam się do pytania, które zadał Tuner. FrontControler ZF jest fajny do pisania prostych stron, ale jak przy jego pomocy zbudować aplikację modularną? Chodzi mi oczywiście o taką oraganizację kodu aby poszczególne moduły były w jak największym stopniu od siebie niezależne.

Generalnie to już MVC wymusza jakąś tam modułowość, jednak w aplikacji z tutoriala każda część modułu (model, widok i kontroler) są przechowywane w różnych katalogach.

Domyślam się, że chodzi o możliwość takiego napisania modułów aby wszystkie pliki danego modułu były ładnie wydzielone, np. tak:

moduł1
    models
    views
    controllers
moduł1
    models
    views
    controllers

itd.

Żeby to osiągnąć trzeba by pogrzebać przy kontrolerze frontowym i routerze. Dość wygodnie będzie można to zrobić w oparciu o nowy router (RewriteRouter), który ma pojawić się w dzisiejszej wersji 0.1.5.

Dodatkowo wtedy można do każdego modułu jakiś meta plik XML wrzucić z podstawowymi informacjami o module i działałoby to całkiem fajnie.

Co do pytania Tunera: napisanie takiej aplikacji nie różni się od każdej innej. Piszesz modele wyciągające dane menu i skrót wpisów z forum, w kontrolerze przekazujesz to do szablonu i gotowe. Jeśli np. menu ma być generowane dla wszystkich kontrolerów to wtedy najlepiej użyć plugina (Zend Framework Plugins), a jeśli tylko dla konkretnego kontrolera to najlepiej pobranie danych menu i przekazanie ich do widoku rozwiązać w konstruktorze kontrolera.

Wojciechu!

Skoro tak bardzo dobrze idzie Tobie tłumaczenie angielskich tekstów zwracam się do Ciebie w imieniu wielu początkujących w ZF.

Proszę przetłumacz artykuł Luke Dawson-a o Pluginach jak również gdybyś mógł napisać gdzie i jakie pliki trzeba umieścić i jak je ponazywać, żeby ten plugin zadziałał.

Myślę, że nie tylko ja będę Tobie wdzięczny!

Proszę bardzo :) Nie jest to tłumaczenie tylko luźna wariacja na temat, ale mam nadzieję, że się przyda.

A ja mam jedno pytanko: mam mianowicie sytuację:

Wszystkie pliki nie są umieszczone w głównym katalogu serwera (,że odwołuje sie do nich w sposób :www.strona.pl/controller/action) a w jakimś podkatalogu (np. http://www.strona.pl/podkatalog1/podkatalog2/controller/action). Niestety nie potrafię skonfigurować tak ModRewrita żeby mi to “chytał”.

Bardzo proszę o pomoc :-)

Użyj nowego RewriteRoutera, tam jest coś takiego jak RewriteBase.

Teraz pytanie za 100 pkt. Co zrobić żeby Zend_Db dobrze odsługiwał polskie znaki. Baza MySQL w UTF-8 a chce żeby znaki wyświetlał w iso-8859-2 czy w latin2, jak kto woli.

funkcja iconv(), nie działa, chyba że źle dobieram parametry.

Z góry wielkie dzięki za pomoc!

Dla potomnych, wystarczy to:

$db->query(’SET NAMES latin2′);
$db->query(’SET CHARACTER SET latin2′);

Dzięki za stworzenie tutoriali do ZF - bardzo mi pomogły :D

Piotrku, jeśli baza jest w UTF-8 to lepiej chyba już całą aplikację zrobić przy użyciu UTF-8 :)

Seba, małe sprostowanie - powyższy tutorial jest tylko tłumaczeniem, jego autorem jest Chris Shiflett.

Witajcie, mam następujący problem: w jaki sposób przy takiej konfiguracji jak ta w artykule powyżej można dostać się do parametru “c” w tak skonstruowanym adresie: adres.domena/a/b/c
Jak wiemy: a - to nazwa kontrolera, b - nazwa akcji, c - no właśnie?
Chodzi mi tu dokładnie o możliwość tworzenia akcji typu: adres.domena/admin/delete/5 (co możnaby porównać do aprove w powyższym tekście, jednakże chciałbym przekazywać id rekordu w aresie, a nie jak tutaj poprzez formularz, metodą POST).

To jeszcze raz ja ;), poszukałem już i znalazłem - metoda Zend_Controller_Action::_getParam
pozdrawiam.

A propo’s umieszczania strony w podkatalogu serwera. Wystarczy zamiast Zend_Controler_Routera uzyc Zend_Controler_RewriteRoutera i plik .htaccess wrzucic do tego podkatalogu zamiast do katalogu glownego. RewriteRouter powinien sam rozpoznac sciezke, ale wrazie czego mozna ustawic recznie RewriteBase. RewriteRouter teoretycznie zostal stworzony w celu wyeliminowania koniecznosci stosowania mod_rewrite, ale nie znaczy to ze ta nowa wersja ZF Routera nie bedzie wspolpracowac z plikami .htaccess

przykład fajny, ale ja szukam już któryś dzień jak zrobić taką operację

if($sesja->zalogowany)
{
$frontController->dispatch();//idź gdzie sobie chcesz
}
else
{
// idź do strony z logowaniem
}

do tej pory nie wiem jak to wykonać - nie mam pojęcia nie znalazłem przykładów na to - nie wiem co zrobić
dzięki jednej osobie dotarłem do strony

http://www.nabble.com/Zend_Acl—Zend_Auth-example-scenario-tf3165728s16154.html

przykład rozbudowany - z rozbudowanym systemem, ale dalej nie rozumiem jak to wykonać

jest tam przykład

->setControllerDirectory(array(’default’ => realpath(’../application/controllers/default’),
‘admin’ => realpath(’../application/controllers/admin’)))

i nie wiem, czy z tego wynika, że ja powinienem zrobić dwie ścieżki do kontrolera? jedną dla zalogowanych druga dla niezalogowanych

normalnie było prosto szybko i zwyczajnie
if(!$_SESSION[’zalogowany’)
header(’location:index.php?action=login’);

a przy ZF nad takim czymś męczę się prawie trzy dni i nie wiem jak to zrobić - na jakiej zasadzie ma się to oprzeć itp

Dzięki za tutorial ZF zaczyna mi się krystalizować w umyśle ;)

[…] Zend Framework Tutorial - Wojciech Naruniec […]

Do ktorego zend-a to bylo pisane?

W 1.0.3 nie dziala od poczatku ten tutek, mimo ze zmienilem Zend::loadClass na Zend_Loader::loadClass? Moze jest jakis Tutorial do 1.0.3??

Dzieki

jaskooo, to rozwiązuje problem…
$controller=Zend_Controller_Front::getInstance()
->setControllerDirectory(’../app/controllers’)
->setParam(’noViewRenderer’,true) //recepta
->dispatch();

Pytanie: http://www.costam.pl/controller/action, jak zrobić tak że jak user zapoda w przeglądarce controller/action.html to wykona się ta sama akcja?