Začínáme
V první kapitole si stáhneme Nette Framework, seznámíme se s obsahem distribuce a připravíme si adresářovou strukturu naší aplikace.
Stažení a instalace
Nejprve si vytvoříme na místě, které bude přístupné z našeho
vývojového webového serveru, prázdný adresář, do kterého umístíme
náš projekt. Pojmenujeme ho například quickstart. Při
nahrávání na produkční server je výhodné některé soubory oddělit od
prostoru, který je z webu nepřístupný, ale prozatím se tím nebudeme
zabývat. Všechny bezpečnostní tipy a triky naleznete v poslední kapitole
návodu.
Nyní si stáhneme Nette
Framework. Archiv rozbalíme (prozatím je jedno kam) a podíváme se na
jeho obsah. Nejvíce nás budou zajímat složky Nette a
sandbox. Složka Nette, jak již název napovídá,
obsahuje samotný Nette Framework. Složka sandbox obsahuje
předpřipravenou kostru aplikace založené na Nette. Tato kostra nám usnadní
mnoho práce a tak jí ihned zneužijeme. Obsah této složky rozbalíme do
naší složky projektu. Adresářová struktura bude vypadat nějak takto:
quickstart/ +-- app/ +-- libs/ +-- log/ +-- temp/ +-- tests/ +-- www/
Pokud používáte operační systém GNU/Linux (případně
jiný unix-like systém, např. Mac OS), budete potřebovat nastavit
oprávnění pro zápis do složky temp a v produkčním
prostředí i do složky log. Nejsnazší bude použít příkaz
chmod -R a+rwX temp log, ten ale nebývá vždy nejvhodnější.
Pečlivě zvažte, jaká oprávnění je potřeba nastavit.
Připraveno!
Nyní by mělo být vše připraveno a pokud zadáme do prohlížeče adresu
našeho webového serveru a odkážeme se na adresář www
z našeho quickstartu, měla by nás uvítat následující stránka:

Podívejme se nyní podívat na jednotlivé složky:
- Složka
appbude obsahovat samotné zdrojové kódy a šablony naší aplikace. Většina naší práce se bude odehrávat právě v této složce. - Složka
libsslouží k umístění knihoven třetích stran, které bude naše aplikace využívat. Jednou (a prozatím jedinou) takovou knihovnou bude právě Nette Framework. Při použití předem připravené kostry z distribuce je Nette Framework již připraven k použití. - Do adresáře
log, jak již název napovídá, se ukládají informace o mimořádnostech při běhu aplikace, například chybová hlášení. Nette toto ukládání chybových hlášení používá ve výchozím nastavení pouze v produkčním prostředí, takže nás tato složka nebude zatím zajímat. - Adresář
tempslouží na dočasné soubory, převážně cache a data sezení. Některé změny v aplikaci (typicky nějaké větší přesouvání tříd, úprava konfiguračních souborů a podobně) občas budou vyžadovat vymazání „cache“, která sídlí právě v této složce. V některých případech si Nette poradí samo, pokud se ale naše aplikace chová podivně, je nutné cache smazat ručně. Cache je nutné mazat také při aktualizaci Nette. - Do složky
testsbudeme ukládat unit testy naší aplikace. Protože je to naše první aplikace, nebudeme se psaním testů zatím zatěžovat, nicméně je výhodné testy psát. Proto bude psaní testů v prostředí Nette popsáno v jednom z navazujících návodů. - Složka
wwwby měla být jedinou složkou, která bude veřejně přístupná z webu. Právě do ní by měl v produkčním prostředí ukazovat tzv.document rootwebového serveru. Budeme do ní ukládat obrázky, JavaScripty, CSS a další veřejně dostupná data, na která budeme potřebovat odkazovat z aplikace.
Pojďme se na složku app nyní podívat podrobněji…
Složka app
Jak již bylo řečeno, jedná se nejdůležitější adresář naší aplikace a budeme v něm trávit většinu času. Adresářová struktura této složky vypadá následovně:
app/
+-- config/
+-- config.neon
+-- models/
+-- Authenticator.php
+-- presenters/
+-- BasePresenter.php
+-- ErrorPresenter.php
+-- HomepagePresenter.php
+-- SignPresenter.php
+-- templates/
+-- Error/
...
+-- Homepage/
...
+-- Sign/
...
+-- @layout.latte
+-- maintenance.phtml
+-- bootstrap.php
Adresář config
V tomto adresáři se nacházejí konfigurační soubory. Z těchto souborů budeme konfigurovat připojení k databázi, měnit nastavení PHP, registrovat služby a mnohé další věci. Těchto konfiguračních souborů může být i víc, my si však vystačíme pouze s jedním.
Adresář models
V adresáři models jsou umístěny datové modely aplikace.
Jsou to třídy, které zapouzdřují a zajišťují komunikaci aplikace
s datovými úložišti, typicky databází. Modely si pořádně představíme
později a ukážeme si pravidla, kterými bychom se při navrhování datové
vrstvy měli řídit.
Adresář presenters
V adresáři presenters se nacházejí tzv. presentery. Jedná
se o třídy, které zajišťují správné propojení jednotlivých částí
aplikace – šablon, komponent a modelů. Toto oddělení prezentační vrstvy
od datové se jeví jako velmi výhodné. Více se na presentery podíváme
v další kapitole.
Adresář templates
V této složce jsou šablony naší aplikace. Každý presenter (kromě
BasePresenter) zde má vlastní složku se šablonami. Jednotlivé
šablony pak představují „pohledy“ presenteru a jsou kombinací HTML a
šablonovacího jazyka Latte.
bootstrap.php
Soubor bootstrap.php představuje „zavaděč“ aplikace.
Stará se o správné načtení Nette, načtení konfigurace z
config/config.neon, nastavení routování a nakonec samotné
spuštění aplikace. Pojďme si tento soubor nyní ve stručnosti
představit.
Na začátku je pouze výchozí hlavička souboru a direktiva
use, která nám říká, že v tomto souboru se chceme na třídu
Nette\Application\Routers\Route odkazovat pouze jejím krátkým
jménem – Route.
Pokud nevíte, k čemu direktiva use slouží,
konzultujte PHP manuál na téma jmenné
prostory.
Řádkem
require LIBS_DIR . '/Nette/loader.php';
provedeme načtení Nette. Soubor loader.php načte některé
základní soubory a nastaví mechanismus automatického načítání
jednotlivých částí Nette až v případě jejich potřeby, my se tudíž
nemusíme starat o další načítání Nette tříd pomocí
require.
Řádek
$configurator = new Nette\Config\Configurator;
vytvoří nový objekt konfigurace. Právě tento objekt se stará o načtení konfiguračního souboru aplikace.
Řádky
//$configurator->setProductionMode($configurator::AUTO);
$configurator->enableDebugger(__DIR__ . '/../log');
povolí laděnku. Ta nám usnadní
práci při hledání chyb, a to jak při vývoji, tak na produkčním serveru.
Řádek s voláním setProductionMode() nám po odkomentování
umožní nastavit, zda je aplikace v produkčním prostředí, případně
ovlivnit detekci uvedením IP adres vývojového prostředí.
Pokud máte webový server umístěn jinde, než na
localhostu, bude laděnka pracovat v produkčním režimu, ve
kterém Vám chybu přímo nevypíše. Nastavení vývojového režimu lze buď
vynutit uvedením $configurator::DEVELOPMENT jako prvního
parametru volání setProductionMode()
($configurator::PRODUCTION by naopak vynutilo produkční režim),
nebo uvedením seznamu IP adres klientů (nikoliv serveru), pro které bude
vývojový režim povolen. Pokud tedy Váš počítač má IP adresu například
192.168.1.215, upravte volání takto:
$configurator->setProductionMode('192.168.1.215');. Více IP
adres by bylo odděleno čárkou.
$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(APP_DIR)
->addDirectory(LIBS_DIR)
->register();
$configurator->addConfig(__DIR__ . '/config/config.neon');
$container = $configurator->createContainer();
Načte konfigurační soubor config/config.neon. Tento soubor
obsahuje nastavení naší aplikace, v našem případě zejména připojení
k databázi. Také si povšimněte volání
$configurator->createRobotLoader(). RobotLoader je
služba Nette, která indexuje soubory v zadaných složkách a stará se o automatické načítání tříd
v případě jejich potřeby. Protože jedna ze zadaných složek je naše
složka app, budou se nám veškeré třídy načítat automaticky
bez nutnosti jejich manuálního načítání pomocí require.
Řádky
$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
nastavíme routování. Jedná se o mechanismus, který se stará o správný překlad URL adresy na vnitřní požadavek aplikace a opačně. To nám umožní používat hezké URL adresy a kdykoliv je bez jediné změny ve zbytku aplikace upravit. Routování si podrobněji představíme v jedné z posledních kapitol, prozatím si vystačíme s těmito routami, které jsou dostatečné pro většinu aplikací.
Nakonec řádky
$container->application->run();
spustí naší aplikaci, která zajistí vytvoření presenteru a vyřízení požadavku od klienta.
Nyní, vyzbrojeni základními znalostmi, se můžeme pustit do samotného programování naší aplikace.