spájame
slovenskú
IT komunitu
pridaj sa
Registrácia · Login

František Čaník 7.3.2011, článok je súčasťou seriálu Nette PHP framework
Hodnoť článok:
0 0

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:

Nette základná app

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:

Nette modulárna app

Ako ste si isto všimli, pribudli nám tam 2 adresáre, ktoré obsahujú svoje presentery a templaty:

Nette

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.

František Čaník František Čaník

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.


Hodnoť článok:
0 0

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:


Zabudol som heslo

0 0 Andrej Molnar 16.9.2011 02:51:54
neni to samostacne na pochopenie, ale po precitani nejakej dokumentacii k tomu a trial and error to i vdaka tomuto tutorialu celkom dobre slo
0 0 Mário Doskoč (fb) 10.6.2011 00:00:00
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.
0 0 Pan Inkognito (fb) 8.4.2011 00:00:00
Super, to mě samozřejmě těší :-)
0 0 František Čaník (fb) 8.4.2011 00:00:00
Inkognito: nič neumrelo, len som sa musel venovať aj práci :) ale vo finále, predpokladám, že čoskoro prídu ďalšie časti :)
0 0 Pan Inkognito (fb) 25.3.2011 00:00:00
Seriál nejspíš umřel :-)
0 0 Pan Inkognito (fb) 20.3.2011 00:00:00
Bude ještě nějaký díl?
0 0 František Čaník (fb) 9.3.2011 00:00:00
@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?
0 0 Pan Inkognito (fb) 8.3.2011 00:00:00
Srigi, trošku sis teď nadběhl - Co takhle vlastní seriál nebo další screencast? :-)
0 0 Igor Hlina (fb) 8.3.2011 00:00:00
@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).

:)
0 0 František Čaník (fb) 7.3.2011 00:00:00
@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" :)
0 0 Jack Jackm Man (fb) 7.3.2011 00:00:00
druhý díl, super až budem mít chuť přečtem.
0 0 Igor Hlina (fb) 7.3.2011 00:00:00
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.
Zajtra.sk > Programovanie > PHP > Nette PHP framework (2): Štruktúra, začíname s Nette


Kritika

Vieš ako robiť veci lepšie? Pomôž našim odvážnejším členom a skritizuj im projekty!

Reklama

Seriály zo Zajtra.sk

Reklama