Nette PHP framework (2): Štruktúra, začíname s Nette
Štruktúra Nette, ukážky .htaccess, bootstrap.php, config.ini a vytvorenie prvej jednoduchej Hello World! aplikácie v Nette...
Web, či už sa jedná o osobnú stránku, alebo o portál, má svoju štruktúru a hierarchiu. Rovnako tak tomu je aj pri samotných frameworkoch, ktoré sa riadia určitými pravidlami, ktoré dokážu ochrániť beh celej aplikácie. Výnimkou nie je ani Nette, ktoré sa drží práve bezpečnosti aplikácie tak striktne, že odporúča držať všetky scripty frameworku mimo dostupný root webu. Poďme sa teda spolu pozrieť na to, ako by mala vyzerať štruktúra adresárov a ako správne „rozbehnúť“ základnú aplikáciu.
Držte citlivé scripty mimo priestor, ktorý je dostupný z webu
Aj takto by sa to dalo v skratke povedať. Bezpečnosť je zaručená hlavne vtedy, keď nie je možné priamo z prehliadaču pristupovať k súborom aplikácie, ktoré sú nachylné na „nespracovanie“ serverom a dokážu teda odoslať všetky nastavenia. Veľmi náchylný na tento problém je súbor config.ini, ktorý obsahuje väčšinu nastavení ako serverových, tak aj databázových. Odporúčaná štruktúra preto vyzerá nasledovne:
V prípade, že by ste chceli používať administráciu (čo je viac ako pravdepodobné a preto celý seriál budeme riešiť práve modulárnu aplikáciu), Vaša adresárová štruktúra by mala vyzerať takto:
Ako ste si isto všimli, pribudli nám tam 2 adresáre, ktoré obsahujú svoje presentery a templaty:
To nám však náš web vôbec nerozchodí, pretože treba nastaviť súbor config.ini
a základný súbor, ktorý riadi routovanie celého webu – bootstrap.php
v spolupráci s .htaccess
. Správne routovanie zabezpečuje hlavne .htaccess
, ktorý vo svojej jednoduchosti vyzerá nasledovne:
.htaccess ukážka:
# nastavenie pre PHP php_flag magic_quotes_gpc off php_flag register_globals off # mod_rewrite RewriteEngine On # v prípade, ze je nutne nastavovat (routujete z ineho adresara ako je webroot) #RewriteBase / # front controller # hlavny controller (index.php) a obmedzenie requestov na urcite typy suborov RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
Tento .htaccess nám zabezpečí, že všetky requesty prejdú naším index-om, ktorý v sebe skrýva zadefinované hlavné cesty k adresáru LIBS a k súboru bootstrap.php, ktorý je hlavným spúšťačom celého framework-u. Jeho defaultný obsah:
bootstrap.php ukážka:
<?php /** * Nahranie framework-u */ require_once dirname(__FILE__) . '/../libs/Nette/loader.php'; /** * Nacitanie konfiguracie (zo suboru config.ini) */ NEnvironment::loadConfig(); /** * Nastavenie a predpriprava systemu */ NDebug::enable(); // zapnutie debug-u { defaultne zistuje, ci ide o dev, alebo ostry } $application = NEnvironment::getApplication(); // nacitanie aplikacie $router = $application->getRouter(); // vytvorenie hlavneho routovania $router[] = new NRoute('index.php', array( 'presenter' => 'Default', 'view' => 'default', ), NRoute::ONE_WAY); // nastavenie hlavnej routy na hlavnu stranku $router[] = new NRoute('<presenter>/<view>/<id>', array( 'presenter' => 'Default', 'view' => 'default', 'id' => NULL, )); // nastavenie routy, kde prvy predany parameter urcuje presenter, atd. /** * Spustenie! */ $application = NEnvironment::getApplication(); $application->run();
Ako ste si už isto všimli v tomto kóde, hneď v úvode sa načítava základná aplikácia, ktorá sa dopytuje na konfiguráciu. Tá je zapísaná jednak v systéme (základné parametre preberá priamo z php) a zo súboru config.ini:
config.ini ukážka:
[common] set.date-timezone = "Europe/Bratislava" set.iconv-internal_encoding = "%encoding%" set.mbstring-internal_encoding = "%encoding%" ; Nastavenia pre produkcne prostredie (ostry server) [production < common] set.include_path = "%appDir%/libs;%modelsDir%/;%presentersDir%/" ; Nastavenia pre developerske prostredie ; prepisujte iba data, ktore su rozdielne od produkcneho prostredia! [development < production]
Ja osobne som sa stretol vždy pri tvorbe webu s nekonečnými prepisovaniami config-ov a ich nastavení v produkčnom prostredí. Tento jednoduchý config vyrieši všetko za Vás a systém sa sám rozhodne, ktoré z nastavení použije. Ak sa Vaše údaje zhodujú ako v produkčnom, tak aj v dev.prostredí, nemusíte meniť nič a stačí Vám vyplniť údaje o produkčnom prostredí.
Základné nastavenia a „Ahoj svet!“ v Nette
„Hello World!“ aplikácia
Nakoľko sme sa rozhodli, že naša aplikácia bude potrebovať aj tzv. backend (administráciu), je potrené aby ste v bootstrap.php vykonali jednoduchú zmenu, ktorá bude rozhodovať o tom, ktorý presenter a ktorý model sa bude načítavať. Výsledok by mal vyzerať nasledovne:
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) { $router[] = new NRoute('index.php', array( 'module' => 'Front', 'presenter' => 'Default', 'action' => 'index' ), NRoute::ONE_WAY); $router[] = new NRoute('[ <module admin|front>/]<presenter>/<action>/<id>', array( 'module' => 'Front', 'presenter' =>'Default', 'action' => 'index', 'id' => NULL )); } else { $router[] = new NSimpleRouter('Front:Default:index'); }
Táto časť nám – ako ste si už možno všimli, bude rozhodovať o tom, či sa bude načítavať modul Admin, alebo modul Front. O routovaní si však ešte budeme písať v samostatnej kapitole, nakoľko práve toto je časť, ktorá je v diskusiách o nette dosť obsiahla a myslím si, že si zaslúži svoju vlastnú kapitolu.
Spustenie a ups, chyba => chýba ešte niečo...
Áno, keby ste si teraz spustili aplikáciu, asi by ste videli chybu, pretože Váš presenter asi neobsahuje nič, čo by sa vykonalo. Je veľmi dôležité si uvedomiť, že i keď vytvoríte skript, ktorý obsahuje len čistú triedu, sú hľadané základné súbory, ktoré zobrazujú web. Medzi tieto súbory patrí @layout.phtml (vo verzii 2 alpha už hľadané ako .latte) a vzhľadom na volaný presenter – v tomto prípade Default – je hľadaný aj template pre obsah presenteru – default.phtml.
@layout.phtml / @layout.latte – Kostra Vášho webu.
Celý web má – ako asi každý template – svoju kostru, ktorá určuje základné HTML dookola rôznych jednotlivých blokov. V rámci Nette frameworku sú tieto dynamické bloky rozdeľované na bloky , snipety či samostatné controlery. Pre nás osobne je v úvode potrebné vedieť hlavne o blokoch – {block}
. Základný layout by teda mohol vypadať nasledovne:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="description" content="Nette Framework – Tutorial by Zajtra.sk"> <meta name="robots" content="{$robots}" n:ifset="$robots"> <title>Aplikácia NETTE – Zajtra.sk - Tutoriál</title> <link rel="stylesheet" media="screen,projection,tv" href="{$basePath}/css/screen.css" type="text/css"> <link rel="stylesheet" media="print" href="{$basePath}/css/print.css" type="text/css"> <link rel="shortcut icon" href="{$basePath}/favicon.ico" type="image/x-icon"> </head> <body> {foreach $flashes as $flash} <div class="flash {$flash->type}"> {$flash->message} </div> {/foreach} {block #content} Tento text sa zobrazí v prípade, že nie je posielaný obsah bloku „content“ {/block} </body> </html>
V template @layout.phtml máte možnosť vidieť parametre, ktoré sú posielané defaultne aplikáciou. Ide o parametre $robots
, $basePath
, $baseUri
a $flashes
. Základné premenné asi vysvetlovať nemusím, pretože každému asi príde na um, čo bude obsahovať $robots
, či $basePath
. Zaujímavé je však použitie premennej $flashes
, ktorá v sebe ukrýva všetky chybové či iné „hlášky“, ktoré sú ukladané do session a zobrazované v prípadoch, kedy potrebujeme zobraziť tzv. flash správu. Ďalej ste si mohli všimnúť, že sa v template volá {block #content} …{/block}
. Môže byť nahradený aj volaním {include #content}
, ktorá zabezpečuje vloženie obsahu, ktorý je posielaný z templatu presenteru. V našom prípade je obsah daného bloku nahradený obsahom templatu default.phtml, ktorý vyzerá nasledovne:
{block content} <p> Ahoj svet! </p>
Dôvod, prečo je v @layout.phtml volaný block pomocou „mriežky“, znamená to, že sa systém pokúsi nájsť „pomenovaný“ blok – v tomto prípade sa pokúsi nájsť blok, ktorý sa volá „content“. Pri použití funkcie include môžete vložiť akúkoľvek inú šablónu – či už za pomoci relatívnej či absolútnej cesty k súboru .phtml.
Záverom
Vysvetlovať systém šablón a ich uľahčovania – tzv. helpery, je ďalšou kapitolou nášho seriálu. V nej si vysvetlíme, prečo používať {block}
… {/block}
a ako správne písať link-y.

Programátor, webdesigner a webdeveloper niekoľkých webových projektov. Má za sebou prácu v reklamnej agentúre, médiách a na rôznych pozíciách v oblasti IT.
12 komentárov k článku:
Komentovať môžu iba prihlásení
Zaregistruj sa cez bezplatnú registráciu alebo použi login cez Facebook (FB Connect)
Prihlás sa tu, ak už máš profil na Zajtra.sk:

Zdravim, musim podakovat autorovi, velmi pekne to napisal. Paci sa mi styl pisania ze sa nezaoberas len tym ako spravit app ale skor tym ako to priblizne funguje. Velka vdaka a ti co tu frflu ze to ma pisat inak :) tak nech si spravia vlastny serial.

Inkognito: nič neumrelo, len som sa musel venovať aj práci :) ale vo finále, predpokladám, že čoskoro prídu ďalšie časti :)

@Igor: aby som bol úprimný, keď som ja vytváral tieto "rapid apps" ako si to ty nazval, tak či tak som 90% kodu zmazal, pretože tie "demo" ukážky z modulárnej app mi tak či onak extrémne nepomohli... môžem sa o nich síce v článku vyjadriť, ale tak či onak, keď niekto začína vytvárať app, tak ju potrebuje postaviť na "čistom" základe a nie na niečom, čo musí "premazávať", aby mal čistú štruktúru... alebo sa mýlim?

Srigi, trošku sis teď nadběhl - Co takhle vlastní seriál nebo další screencast? :-)

@frantisek: Suhlasim, je dobre citatelom odkryvat vedomosti "od spodu". Ale napr. pri seriali o web frameworku beziacom v PHP na Apache, by som sa ja osobne nezatazoval naozaj drobnostami ako je mod_rewrite alebo rucne vytvaranie struktury.
Nette bolo vytvorene pre rychle budovanie webappz. Myslim si, ze by bolo fajn keby si prave tento "rapid development" citatelom ukazal formou "toto takto rozzipujte, tu prepiste toto a mate Hello World".
Ale je to len taky moj hint/povzdych (povzdych ako by som to kcel mat v seriali ja - je to tvoj serial, nebudem uz frflat na to ako ho pises).
:)

@igor: Články píšem tak, aby ich mohli ľudia (aj začiatočníci) pochopiť. Ja som sa postavil pred nette od piky a musel som sa všetko učiť sám štýlom pokus-omyl, pretože dokumentácia je, aká je. Mojou snahou je, priblížiť všetky úskalia a tie sú, podľa mňa, už aj pri samotnom "úvode", kde si musí človek vybrať to, či chce ísť na 0.9.x (Stable), alebo chce ísť do "2.0 alphy".
Určite sa však budem v článku venovať práve využívaniu modulov, pretože o tom je v podstate v dnešnej dobe každý web, pretože má svoj front a aj svoj backend...
Ad 2) "from scratch"... videl si niekedy knihu o PHP, ktorá by bola písaná v štýle, že rozoberajú rovno novinky a kašlú na "pozadie" vzniku scriptovacieho jazyku, jeho štandardy a pod? Asi nie, však? Či už ide napr. o knihu o PHP 4, 5, alebo novej 6-tky, všade som vždy našiel tú veľavravnú kapitolu s názvom "Hello world" :)

Ahoj, je fajn,ze detailne popisujes adresarovu strukturu alebo .htaccess. Lepsie by vsak bolo, keby si citatelom ukazal ako z distribucneho archivu rozbalit example "modules-usage" a pripravil ich na pripadne problemy. Pisat Nette appku "from scratch" je nesystemove, nikto to takto nerobi.
Ale drzim palce do dalsich dielov.
Novinky
1 rokom
Používatelia Chrome začali prechádzať na nový rýchlejší Firefox, avizujú dáta Mozilly
Nový lepší a rýchlejší prehliadač Firefox 57 Quantum vyúsťuje zrejme do viac používateľov prechádzajúcich respektíve vracajúcich sa na tento prehliadač z iných prehliadačov, na osobných počítačoch aj smartfónoch.
1 rokom
Briti dokončili kúpu SK-NIC-u. Nové .sk domény nechávajú za 8.4 eur
Predaj správcu slovenskej domény .sk, SK-NIC, bol dokončený a novým majiteľom po telekomunikačnej skupine Danubiatel, do ktorej patrí napríklad Swan a 4ka, je britská spoločnosť CentralNic.
1 rokom
Šifrovanie diskov v Linuxe sa výrazne zlepšuje, dostáva ochranu integrity
Technológia šifrovania diskov LUKS podporovaná v Linuxe a využívaná mnohými linuxovými distribúciami dostáva výrazné vylepšenie v podobe vydania novej hlavnej verzie nástroja cryptsetup 2.0.0.
1 rokom
Blýská se Tesle na lepší časy? PepsiCo objednala 100 kamionů Semi
Známá automobilka Tesla má v poslední době problémy s plněním ambiciózních výrobních plánů stanovených vizionářem Muskem a pohybuje se v červených číslech.
1 rokom
DSL rozchodili cez mokrý špagát, dosiahli 3.5 Mbps. Nesimulovali slovenské linky?
Technik menšieho britského telekomunikačného operátora Andrews & Arnold uskutočnil zaujímavý experiment, keď sprevádzkoval pripojenie technológiou ADSL cez namočený špagát.
Staršie novinky »TOP dlhšie
- 01 Podporte každoročnú akciu Týždeň práce z domova (5029x)
- 02 Inteligentná domácnosť: III. diel - inštalácia a rozbehanie ovládania (851x)
- 03 Môj život s Philips Hue (519x)
- 04 Java 8 - Lambda výrazy (465x)
- 05 GDPR: Pozor na dáta na vyradených diskoch! (441x)
- Aj ty môžeš byť najčítanejší. Napíš článok »
TOP tento mesiac
- 01 Skvelý dôvod, prečo sa hráči mali zbaviť káblov (183x)
- 02 Nahradí micro LED televízory OLED? (82x)
- 03 PPC – vojna, alebo ako poraziť konkurenta (80x)
- Aj ty môžeš byť najčítanejší. Napíš článok »
Nové články:
- 1.PPC – vojna, alebo ako poraziť konkurenta
feb - 31.Nahradí micro LED televízory OLED?
jan - 30.Skvelý dôvod, prečo sa hráči mali zbaviť káblov
jan - 14.Šifrované SSD Kingston UV500
dec - 10.50 rokov od predstavenia myši
dec - Viac »
- Aj ty môžeš byť najčítanejší. Napíš článok »
Pekné veci
Pekné veci
Pekné veci
Pekné veci
Posledné komentáre
- Zdravím, mám restaurační zařízení v turisticky hojně navštěvované oblasti, kde je však k...
- Kingston je najlepsia znacka na usb,flash discy ako aj na sd karty. Kto by chcel moze vy...
- Tiez pouzivame profit365, v ramci tychto ekonomickyhc softverov nam daval najlepsi vyzna...
- Taketo zariadenie by sa mi zislo. Mam viacero zariadeni od TP Link, skvela znacka na zar...
- Mam doma smart TV Philips s ambilight. Dobre sa pozera na TV ked je zo zadu osvetlene a ...
Kritika
Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!
Reklama
Slovenská IT komunita
Seriály zo Zajtra.sk
· Ako písať blog
· Ako sa stať PHP ninja s Yii Frameworkom
· Aplikácie pre Facebook
· CSS triky
· iOS vývojára príhody a skúsenosti
· Jednoduché programy, ktoré vám ušetria čas
· Modelovanie webového sídla
· Nauč sa CodeIgniter [HD]
· Nauč sa jQuery [HD]
· Nette PHP framework
· OOP v Javascripte
· Programujeme v Jave
· Programujeme v Lazaruse
· Programujeme v Pythone
· Robíme Eshop v ASP.NET Web Pages
· Slovenskí iOS developeri
· Webdizajn krok po kroku
· Yablkov TurboTip [HD]
neni to samostacne na pochopenie, ale po precitani nejakej dokumentacii k tomu a trial and error to i vdaka tomuto tutorialu celkom dobre slo