3. díl - První aplikace v Nette

PHP Nette Framework Základy První aplikace v Nette

Vítejte u třetího dílu seriálu tutoriálů o tvorbě webových aplikací v PHP frameworku Nette. V tomto díle bych chtěl prakticky navázat na 2. díl - Nette sandbox a IDE. Ukážeme si tedy tvorbu první jednoduché aplikace, na ní si vysvětlíme základní strukturu a konfiguraci frameworku a především základy MVP.

Volba aplikace

Výběr vhodné aplikace, na které bychom si mohli demonstrovat vše potřebné, nebyl úplně snadný, ale nakonec se vítězem stala jednoduchá kalkulačka, jejíž screenshot vidíte níže. Takže když už víme v čem a co budeme dělat, tak hurá do práce! :)

Kalkulačka

Instalace Nette

Abychom mohli začít programovat, musíme si nejdříve Nette nějakým způsobem nainstalovat. Tyto způsoby jsou všeho všudy 2:

1) Klasický download a rozbalení

Nette si klasicky stáhnete a rozbalíte do dané projektové složky z oficiální stránky. Můžete si založit i nový sandbox, jak jsme si ukazovali minule, projekt si pojmenujte calculator-nette.

2) Přes Composer

Pokročilejší uživatelé mohou použít Composer, cože je nástroj na správu závislostí v PHP. Nejdříve si ho musíte opět stáhnout a nainstalovat a jak na to najdete zde. Když už máte Composer připravený, stačí si otevřít danou projektovou složku a spustit konkrétní příkaz, který zařídí celou instalaci Nette a zkontroluje i potřebné závislosti.

Nový projekt vytvoříme příkazem:

composer create-project nette/web-project calculator-nette

Tímto příkazem se mi vytvořila základní struktura projektu ve složce calculator-nette. K ní si pouze přidám svůj .htaccess pro automatické přesměrování do složky /www, kde se nachází index.php, kterým se celá aplikace spouští. Vše samozřejmě naleznete v přiloženém archívu.

Závislosti

Ještě si dovolím malou, ale důležitou poznámku k softwarovým závislostem. Pro instalaci Nette se předpokládá, že máte zprovozněný webový server (např. Apache) s PHP ve verzi 5.3.1 nebo vyšší. Pokud nevíte, jak na to, doporučuji přečíst si tento článek. Podrobný návod, jestli váš server splňujete všechny požadavky a jak si to ověřit pak naleznete v minulém dílu.

Nyní stačí zadat do webového prohlížeče url

http://localhost/calculator-nette/

a měli byste vidět tuto základní stránku Nette webového projektu (v případě sandboxu zde budou ještě nějaké informace navíc)

Nette Web project

Pokud se vám tato stránka z nějakého důvodu nezobrazuje, pravděpodobně je něco špatně s vaší konfigurací projektu, takže doporučuji znovu poctivě projít návod i odkazy výše nebo třeba zkusit druhý způsob instalace. A když už opravdu nebudete vědět kudy kam, můžete mi vždycky napsat do komentářů pod článek. ;)

MVP

Teď, když už máme vše připravené, můžeme začít programovat samotnou kalkulačku. A teď vyvstává důležitá otázka a to, odkud začít? Za sebe mohu doporučit 3 způsoby postupu:

1) Postup od Pohledu

V tomto postupu se nejdříve zamyslíme, co chceme vlastně na dané webové stránce zobrazit. Podle toho si navrhneme šablonu (template), kterou ale musíme vyplnit potřebnými daty. Takže následně navrhneme presenter, který potřebná data předává do šablony. Ten ale musí tato data získat z modelu, takže nakonec naprogramuje onen model, který tato potřebná data dodává např. z databáze.

2) Postup od Modelu

Tady je postup v podstatě opačný. Nejdříve se opět zamyslíme jaká data budeme potřebovat zobrazit. K získání těchto dat si vytvoříme model. Dále potřebujeme tato data zpracovat a předat do šablony a k tomu si opět uděláme potřebný presenter. Nakonec navrhneme šablonu, kde se získaná data zobrazí do podoby webové stránky.

3) Kombinace předchozích

Tento postup si bere z každého trochu. Vytváříme postupně šablony i modely a pak se je snažíme pomocí presenterů lepit dohromady. Tohle je asi nejpoužívanější metoda, která nabízí tu výhodu, že můžeme střídavě postupovat z obou směrů vývoje, což je v praxi asi nejpoužitelnější. Jenom musí člověk dát pozor, aby se v tom neztratil, zachoval rozdělení funkčnosti modelů a presenturů a nelepil dohromady ošklivé konstrukce, které mu zkrátka vyplynuly střetem modelu a šablony.

Já v tomto případě zvolím postup číslo dvě, protože se domnívám, že se pro naši kalkulačku více hodí. Takže začneme hezky od Modelu.

Model

Řekněme, že naše kalkulačka bude mít 4 základní operace tj. sčítání, odčítání, násobení a dělení. Tyto operace umístíme do modelu, protože nám vracejí výsledky, tedy naše data. Vytvoříme si tedy složku app/model/, kam umístíme soubor CalculatorManager.php s naší třídou modelu CalculatorManager, která rozšiřuje Nette/Object, definuje naše 4 operace a vypadá následovně:

<?php

namespace App\Model;

use Nette\Object;

/**
 * Model operací kalkulačky.
 * @package App\Model
 */
class CalculatorManager extends Object
{
    /**
     * 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
     * @return int výsledek po dělení beze zbytku
     */
    public function divide($x, $y)
    {
        return round($x / $y);
    }
}

Můžete si povšimnout, že jelikož jsem se rozhodl provádět operace v celých číslech, tak chci tuto vlastnost zachovat i u dělení, tudíž výsledek zaokrouhluji na celá čísla. Dále si bystřejší z vás určitě všimli, že není ošetřeno dělení nulou. To však není chyba a my se k tomu ještě vrátíme.

Takže základní operace bychom měli, to však ještě není všechno. Jelikož by model měl být rozšiřitelný a podle MVP bychom při změně modelu nejlépe neměli měnit ani presenter, ani šablonu, přidáme si ještě jednoduché rozhraní, která nám tyto vlastnosti zajistí. Jen poznamenám, že tyto vlastnosti lze získat i pomocí reflexe, ale té se tady věnovat nechci. To znamená, že přidáme ještě tyto metody a konstanty:

/** 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;
    }
}
…

Nyní jsme schopni přidat další operaci do modelu a přitom v presenteru i v šabloně nemusíme změnit v podstatě nic. A jelikož je to z modelu již opravdu všechno, můžeme se přesunout právě na presenter.

Z tohoto dílu už je to ale taky vše, takže na presenter, routování, formuláře v Nette a šablony se podíváme v díle příštím. :)


 

Stáhnout

Staženo 242x (601.56 kB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

  Aktivity (3)

Článek pro vás napsal Jindřich Máca
Avatar
Autor se věnuje převážně webovým technologiím, ale má velkou zálibu ve všem vědeckém, nejen ze světa IT. :-)

Jak se ti líbí článek?
Celkem (10 hlasů) :
55555


 


Miniatura
Předchozí článek
Nette sandbox a IDE
Miniatura
Všechny články v sekci
Základy Nette frameworku
Miniatura
Následující článek
Dokončení kalkulačky v Nette

 

 

Komentáře

Avatar
mpis
Člen
Avatar
mpis:

Jedna drobná připomínka nebo dotaz:

V kapitole "1) Klasický download a rozbalení" se píše

... projekt si pojmenujte nette-calculator

a v kapitole "2) Přes Composer" se píše

...Nový projekt vytvoříme příkazem:

composer create-project nette/web-project calculator-nette

Je to správně? Asi by to mělo být konzistentní, tzn. stejný název:
buď calculator-nette nebo nette-calculator.
Začátečníka to může uvádět do zmatku.

 
Odpovědět 8.7.2015 10:07
Avatar
Jindřich Máca
Tým ITnetwork
Avatar
Odpovídá na mpis
Jindřich Máca:

Ano, tam je chyba, ale o nic nejde, neboť projekt si můžeš pojmenovat třeba

louka-sedmikrasek

a bude to fungovat pořád stejně. :)

P.S.: Chybu samozřejmě napravím. ;)

Editováno 8.7.2015 10:42
 
Odpovědět 8.7.2015 10:41
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.