Zend framework - index.php
V minulém příspěvku jsem popsal, jak jsem instaloval Zend framework pro použití v mojí PHP aplikaci pro webovou prezentaci. Skončil jsem u vytvořené adresářové struktury a vytvořeném .htaccess souboru.
Jenom toto však nestačí, abychom si zobrazili alespoň úvodní stránku. Ještě nás čeká provést několik kroků. Prvním z nich je vytvoření souboru index.php v rootu naší aplikace, tak jak bylo naznačeno v adresářové struktuře a napsat odpovídající kód.
Bootstrap index.php
Na soubor index.php jsou směrovány veškeré požadavky, to jsme si již definovali pomocí přepisovacích pravidel a tak v tomto souboru nalezneme Front Controller naší aplikace jenž má za úkol vybrat odpovídající konkrétní controller. Tento úkol za nás řeší Zend framework, přesněji řečeno třída Zend_Controller_Front, která obsahuje potřebné vlastnosti a metody.
Ještě dříve než se dostaneme k získání instance front controlleru, musíme nastavit include path, abychom mohli instancovat potřebné třídy. Pro vytvořenou adresářovou strukturu a to následovně:
set_include_path('.' . PATH_SEPARATOR . './library'. PATH_SEPARATOR . './application/models/'. PATH_SEPARATOR . get_include_path());
O zbytek se již postará jediný include a to třídy Zend_Loader.
include "Zend/Loader.php";
Tato, snad mohu říci, statická třída dokáže na základě include path nahrát kód pro třídu, kterou chceme použít. Jak už jsem se zmínil výše, úkolem souboru index.php je získat instanci třídy Zend_Controller_Front. Nejdříve tedy musíme nahrát kód této třídy a následně získat její instanci.
Zend_Loader::loadClass('Zend_Controller_Front');$frontController = Zend_Controller_Front::getInstance();$frontController->setControllerDirectory('./application/controllers');
Nahrání kódu třídy je provedeno voláním statické metody loadClass s uvedením jména příslušné třídy. Na dalším řádku potom získáme instanci třídy. Celkem úmyslně zde neříkám, že vytvoříme novou instanci této třídy, protože voláním statické metody getInstance() získáme instanci již existující třídy, pokud tato již existuje, to vše je řešeno podle návrhového vzoru Singleton. Posledním řádkem pak už jenom nastavíme adresář, ve kterém jsou umístěny konkrétní controllery, přesně v duchu vytvořené adresářové struktury.
Posledním krokem, který vlastně vše zařídí je volání metody dispatch() nad získanou instancí front controlleru.
$frontController->dispatch();
Toto volání zajistí volání konkrétního controlleru (z adresáře ./application/controllers), který odpovídá předaným parametrům - definovaným pomocí url.
A co dál
Jak má takové url vypadat a jak napsat první controller, opět zítra ve stejnou dobu.
Zend_Loader
Nyní si dovolím ještě malinké odbočení a zastavím se u třídy Zend_Loader, která má za úkol nahrát potřebnou třídu. Jelikož tuto třídu budeme nejspíše chtít velice rádi využívat i v ostatních částech naší aplikace, je dobré si ji představit hned v úvodu. Tato třída nahraje soubor s definicí třídy na základě jednoduchého pravidla. Nahlíží do adresářové struktury v include path a z těchto adresářů dokáže nahrát definice tříd. Pokud chceme využívat strukturu adresářů, máme také možnost, podobně jako můžeme vidět na adresáři Zend. Podmínkou je oddělit název třídy podtržítky, kterými jsou odděleny jednotlivé adresáře. Takže například dnes zmíněná třída Zend_Controller_Front se nachází v adresářích ./library/Zend/Controller/ a souboru Front.php.
3 Comments
Štěpán Svoboda said
<p>Pěkný článek :) Mimochodem u toho nastavování include path nevidím nikde žádné oddělovače vícero cest které jsou tam uvedeny, který se mimochodem na Windows a na Linuxu liší...</p>
Štěpán Svoboda said
<p>a teď chápu: domníváte že PATH_SEPARATOR je oddělovač cest v konfiguračních direktivách. Jedná se však o oddělovač adresářů, který nabývá různých hodnot na různých operačních systémech. Pro oddělení cest v této direktivě by měl být tuším na Linuxu použit středník a na Windows dvojtečka (možné prohození - píšu z hlavy)</p>
Štěpán Svoboda said
<p>IMHO není třeba takto definovat include path a ještě jedna na závěr :) Použil bych pro natažení Zend_Loaderu reaději příkaz require, neb bez této třídy není další běh aplikace možný...</p>