3. diel - Prvé aplikácie v Nette
Z minulej lekcie, Nette sandbox a IDE , máme všetko pripravené pre vývoj v Nette frameworku. V dnešnom tutoriále si teda ukážeme tvorbu prvej jednoduché aplikácie. Na nej si vysvetlíme základnú štruktúru a konfiguráciu frameworku a predovšetkým základy MVP.
Voľba aplikácie
Výber vhodnej aplikácie, na ktoré by sme si mohli demonštrovať všetko potrebné, nebol úplne jednoduchý, ale nakoniec sa víťazom stala jednoduchá kalkulačka, ktorej screenshot vidíte nižšie. Takže keď už vieme v čom a čo budeme robiť, tak hurá do práce!
Inštalácia Nette
Aby sme mohli začať programovať, musíme si najskôr Nette nejakým spôsobom nainštalovať. Spôsobov je hneď niekoľko:
1) Klasický download a rozbalenie
Nette si klasicky stiahnete a
rozbalíte do danej projektovej zložky z oficiálnej stránky. Môžete k tomu
využiť aj nejaké to IDE, ako sme si napokon ukazovali minule. Projekt si
pomenujte napr. nette-calculator
.
2) Cez Composer
Pokročilejší používatelia môžu použiť Composer, čo je nástroj na správu závislostí v PHP. Najskôr si ho musíte stiahnuť a nainštalovať a ako na to, nájdete v tomto návode. Keď už máte Composer pripravený, stačí si otvoriť danú projektovú zložku a spustiť konkrétny príkaz, ktorý zariadi celú inštaláciu Nette a skontroluje aj potrebné závislosti.
Nový projekt vytvoríme príkazom:
composer create-project nette/web-project nette-calculator
Týmto príkazom sa nám vytvorila základná štruktúra projektu v zložke
nette-calculator/
. K nej si iba pridáme súbor
.htaccess
pre automatické presmerovanie do zložky
www/
, kde sa nachádza súbor index.php
, ktorým sa
celá aplikácia spúšťa. Všetko, vrátane nástroja Composer, samozrejme
nájdete v priloženom archíve.
Závislosti
Ešte si dovolím malú, ale dôležitú poznámku k softvérovým závislostiam. Pre inštaláciu Nette sa predpokladá, že máte sprevádzkovaný webový server (napr. Apache) s PHP vo verzii 5.6 alebo vyššej. Ak neviete, ako na to, odporúčam prečítať si článok Inštalácia Apache, MySQL a PHP na Windows. Podrobný návod, ako overiť že váš server spĺňate všetky požiadavky nájdete v minulej lekcii.
Teraz stačí zadať do webového prehliadača URL:
http://localhost/nette-calculator/
Mali by ste vidieť túto základnú stránku Nette webového projektu (v prípade sandboxe tu budú ešte nejaké informácie naviac):
Ak sa vám táto stránka z nejakého dôvodu nezobrazuje, pravdepodobne je niečo zle s vašou konfiguráciou projektu, takže odporúčam znovu poctivo prejsť návod aj odkazy vyššie alebo treba skúsiť druhý spôsob inštalácie. A keď už naozaj nebudete vedieť kadiaľ kam, môžete mi vždy napísať do komentárov pod článok
MVP
Teraz, keď už máme všetko pripravené, môžeme začať programovať samotnú kalkulačku. Vyvstáva dôležitá otázka a to, odkiaľ začať? Za seba môžem odporučiť 3 spôsoby konania:
1) Postup od Pohľadu
V tomto postupe sa najskôr zamyslíme, čo chceme vlastne na danej webovej stránke zobraziť. Podľa toho si navrhneme šablónu (template), ktorú ale musíme vyplniť potrebnými dátami. Takže následne navrhneme presenter, ktorý potrebné dáta odovzdáva do šablóny. Ten ale musí tieto dáta získať z modelu, takže nakoniec naprogramuje onen model, ktorý tieto dáta dodáva napr. Z databázy.
2) Postup od Modelu
Tu je postup v podstate opačný. Najskôr sa zamyslíme, aké dáta budeme potrebovať zobraziť. K získaniu týchto dát si vytvoríme model. Ďalej potrebujeme tieto dáta spracovať a odovzdať do šablóny ak tomu si opäť urobíme potrebný presenter. Nakoniec navrhneme šablónu, kde sa získané dáta zobrazia do podoby webovej stránky.
3) Kombinácia predchádzajúcich
Tento postup si berie z každého trochu. Vytvárame postupne šablóny aj modely a potom sa ich snažíme pomocou Presenter lepiť dohromady. Toto je asi najpoužívanejší metóda, ktorá ponúka tú výhodu, že môžeme striedavo postupovať z oboch smerov vývoja, čo je v praxi asi najpoužiteľnejší. Len musí človek dať pozor, aby sa v tom nestratil, zachoval rozdelenie funkčnosti modelov a Presenter a nelepil dohromady škaredé konštrukcie, ktoré mu skrátka vyplynuli stretom modelu a šablóny.
Ja v tomto prípade zvolím postup číslo dva, pretože sa domnievam, že sa pre našu kalkulačku viac hodí. Takže začneme pekne od Modelu.
Model
App / model / CalculatorManager.php
Povedzme, že naša kalkulačka bude mať 4 základné operácie tj.
Sčítanie, odčítanie, násobenie a delenie. Tieto operácie umiestnime do
modelu, pretože nám vracajú výsledky, teda naše dáta. Vytvoríme si
zložku app/model/
, kam umiestnime súbor
CalculatorManager.php
s našou triedou modelu
CalculatorManager
, ktorá používa PHP trait
Nette/SmartObject
a definuje naše 4 operácie:
<?php namespace App\Model; use Nette\SmartObject; /** * Model operací kalkulačky. * @package App\Model */ class CalculatorManager { use SmartObject; /** * Sečte daná čísla a vrátí výsledek. * @param int $x první číslo * @param int $y druhé číslo * @return int výsledek po sčítání */ public function add($x, $y) { return $x + $y; } /** * Odečte druhé číslo od prvního a vrátí výsledek. * @param int $x první číslo * @param int $y druhé číslo * @return int výsledek po odčítání */ public function subtract($x, $y) { return $x - $y; } /** * Vynásobí daná čísla a vrátí výsledek. * @param int $x první číslo * @param int $y druhé číslo * @return int výsledek po násobení */ public function multiply($x, $y) { return $x * $y; } /** * Vydělí první číslo druhým bezezbytku a vrátí výsledek. * @param int $x první číslo * @param int $y druhé číslo; nesmí být 0 * @return int výsledek po dělení bezezbytku */ public function divide($x, $y) { return round($x / $y); } }
Môžete si všimnúť, že keďže som sa rozhodol vykonávať operácie v celých číslach, tak chcem túto vlastnosť zachovať aj u delenie, teda výsledok zaokrúhľuje na celé čísla. Ďalej si bystrejší z vás určite všimli, že nie je ošetrené delenie nulou. To však nie je chyba a my sa k tomu ešte vrátime.
Základné operácie by sme teda mali, to však ešte nie je všetko. Keďže by model mal byť rozšíriteľný a podľa MVP by sme pri zmene modelu najlepšie nemali meniť ani presenter, ani šablónu, pridáme si ešte jednoduché rozhranie, ktorá nám tieto vlastnosti zaistí. Len poznamenám, že tieto vlastnosti možno získať aj pomocou reflexie, ale tej sa tu venovať nechcem. To znamená, že pridáme ešte tieto metódy a konštanty:
// ... /** Definice konstant pro operace. */ const ADD = 1, SUBTRACT = 2, MULTIPLY = 3, DIVIDE = 4; /** * Getter pro existující operace. * @return array asociativní pole konstant pro operace a jejich slovního pojmenování */ public function getOperations() { return array( self::ADD => 'Sčítání', self::SUBTRACT => 'Odčítání', self::MULTIPLY => 'Násobení', self::DIVIDE => 'Dělení' ); } /** * Zavolá zadanou operaci a vrátí její výsledek. * @param int $operation zadaná operace * @param int $x první číslo pro operaci * @param int $y druhé číslo pro operaci * @return int|null výsledek operace nebo null, pokud zadaná operace neexistuje */ public function calculate($operation, $x, $y) { switch ($operation) { case self::ADD: return $this->add($x, $y); case self::SUBTRACT: return $this->subtract($x, $y); case self::MULTIPLY: return $this->multiply($x, $y); case self::DIVIDE: return $this->divide($x, $y); default: return null; } } // ...
Teraz sme schopní pridať ďalšiu operáciu do modelu a pritom v prezentačného aj v šablóne nemusíme zmeniť v podstate nič.
A to je z modelu iz dnešnej lekcie už naozaj všetko. Na nadväzujúce presenter, routovanie, formuláre a šablóny v Nette sa pozrieme v lekcii budúci, Dokončenie kalkulačky v Nette