IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

3. diel - Prvé aplikácie v Laravel

Vitajte u ďalšej lekcie on-line kurzu o tvorbe webových aplikácií v PHP frameworku Laravel. V dnešnom tutoriále prakticky nadviažeme na predchádzajúce lekciu, Inštalácia Laravel a sprevádzkovanie projektu . Ukážeme si tvorbu prvý jednoduché aplikácie a vysvetlíme si jej základnú štruktúru. Pokračujeme teda v projekte z minula.

Voľba aplikácie

Jedna z aplikácií, na ktoré si môžeme demonštrovať úplné základy a je veľmi jednoduchá, je kalkulačka, ktorej screenshot vidíte nižšie. Zámerne som vybral na začiatok kalkulačku, pretože sa zatiaľ nebudeme musieť starať o databáze a konfigurácii. Namiesto toho si však krátko ukážeme tie najdôležitejšie komponenty pre vývoj v Laravel frameworku. Zaoberať sa nimi do hĺbky budeme až v nasledujúcich lekciách.

Kalkulačka v PHP frameworku Laravel - Laravel framework pre PHP

Tvorba kalkulačky

Ako sme si opisovali v prvej lekcii, Laravel je v základe postavený na MVC architektúre. Z tej teraz tiež musíme vychádzať. Tvorbu našej kalkulačky teda začneme od modelu, aby sme si najprv vytvorili dáta pre pohľad a metódy, ktoré môže kontrolér potom ihneď využiť.

Model

Model si môžeme jednoducho vygenerovať cez príkazový riadok / terminál v zložke s naším projektom. Do príkazového riadka otvorenom v priečinku s projektom vložíme nasledujúci príkaz:

php artisan make:model Calculator

Príkaz na vygenerovanie modeli, rovnako ako aj ďalšie príkazy, ktoré dnes použijeme, má veľa možností. Môžeme napríklad vygenerovať CRUD kontrolér k danému modelu. Keďže to ale nie je pre nás teraz podstatné, budeme sa tým zaoberať až ďalej v kurze.

Vygenerovaný model Calculator umiestnený v priečinku app/ vyzerá nasledovne:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Calculator extends Model
{
    //
}

Model v Laravel frameworku z väčšiny prípadov zastupuje databázovú tabuľku, preto modely už v základe dedí z triedy Model, ktorá obsahuje premenné pre definovanie rôznych atribútov a hodnôt a zároveň nám poskytuje objektovo relačné mapovanie pre prácu s databázou. Keďže ale naša kalkulačka nebude prepojená s databázou, môžeme toto dedenie odstrániť.

Teraz si definujeme metódy pre 4 základné operácie - sčítanie, odčítanie, násobenie a delenie. Náš model bude vyzerať nasledovne:

<?php

namespace App;

/**
 * Model operací kalkulačky.
 *
 * @package App
 */
class Calculator
{
    /**
     * Sečti daná čísla a vrať výsledek.
     *
     * @param  int $a
     * @param  int $b
     * @return int
     */
    public function add(int $a, int $b): int
    {
        return $a + $b;
    }

    /**
     * Odečti druhé číslo od prvního a vrať výsledek.
     *
     * @param  int $a
     * @param  int $b
     * @return int
     */
    public function subtract(int $a, int $b): int
    {
        return $a - $b;
    }

    /**
     * Vynásob daná čísla a vrať výsledek.
     *
     * @param  int $a
     * @param  int $b
     * @return int
     */
    public function multiply(int $a, int $b): int
    {
        return $a * $b;
    }

    /**
     * Vyděl bezezbytku první číslo druhým a vrať výsledek.
     *
     * @param  int $a
     * @param  int $b
     * @return int
     */
    public function divide(int $a, int $b): int
    {
        return floor($a / $b);
    }
}

Naša kalkulačka bude vedieť počítať iba v celých čísel. Túto vlastnosť zachováme aj u delenie, kedy vraciame výsledok delenie bezozbytku. A tiež ste si mohli všimnúť, že neošetrujeme delenie nulou. Správne by sme toto mali ošetriť v modeli, aby mohol byť znovu použiteľný aj na ďalších miestach aplikácie. Ku všetkému sa ale dostaneme neskôr.

Pre počítanie v celých číslach som sa rozhodol kvôli jednoduchosti (nemusíme napr. Následne zaokrúhľovať desatinné miesta čísel), ale aj kvôli tomu, že si v nasledujúcej lekcii ukážeme validačné pravidlá pre odoslané dáta (cez formulár). Jedno z nich je práve integer.

Ako ste si mohli všimnúť, použili sme tzv. TypeHinting, ktorý bol pridaný do PHP vo verzii 7. Budem ho používať iba v tejto lekcii a príležitostne aj v ďalších lekciách kvôli dependency injection. Tu ho používam kvôli úplnosti OOP v MVC a tiež kvôli tomu, že teraz chceme počítať iba v celých číslach.

Základné operácie by sme mali. Model by však mal byť rozšíriteľný a podľa MVC by sme pri zmene modelu najlepšie nemali meniť ostatné komponenty. Pridáme si teda do triedy ešte jednoduché rozhranie, ktoré nám tieto vlastnosti zaistí. To znamená, že ešte definujeme nasledujúce metódy a konštanty:

/**
 * Definice konstant pro operace.
 */
const
    ADD = 1,
    SUBTRACT = 2,
    MULTIPLY = 3,
    DIVIDE = 4;

/**
 * Vrať pole dostupných operací, kde klíč je konstanta operace
 * a hodnota název operace.
 *
 * @return array
 */
public function getOperations(): array
{
    return [
        self::ADD => 'Sčítání',
        self::SUBTRACT => 'Odčítání',
        self::MULTIPLY => 'Násobení',
        self::DIVIDE => 'Dělení',
    ];
}

/**
 * Zavolej předanou operaci definovanou konstantou a vrať její výsledek.
 * Pokud daná operace neexistuje, vrať null.
 *
 * @param  int $operation
 * @param  int $a
 * @param  int $b
 * @return int|null
 */
public function calculate(int $operation, int $a, int $b): ?int
{
    switch ($operation) {
        case self::ADD:
            return $this->add($a, $b);
        case self::SUBTRACT:
            return $this->subtract($a, $b);
        case self::MULTIPLY:
            return $this->multiply($a, $b);
        case self::DIVIDE:
            return $this->divide($a, $b);
        default:
            return null;
    }
}

Zaviedli sme konštanty pre jednotlivé operácie, metódu pre navrátenie všetkých podporovaných operácií kalkulačky spolu s ich menovkami a konečne aj spôsob výpočtu, ktorá podľa operácia spustí danú výpočtovej metódu. V praxi by boli jednotlivé výpočtové metódy samozrejme dlhší a počítali niečo zložitejšieho, ale nám to takto ako príklad bohato stačí.

Teraz sme schopní jednoducho pridať ďalšiu operáciu do modelu a nemusíme nijako upravovať ostatné komponenty. Ak by sme toto rozlíšenie podľa operácie vložili napr. Priamo do kontroleru, museli by sme pri pridanie novej operácie už vždy upraviť 2 súbory.

Aj keď sa môže zdať, že sa nejedná zrovna o najideálnejšie riešenie, v rámci nášho kurzu je toto veľmi dostačujúce a jednoduché. Zároveň vďaka tomu si môžeme neskôr ukázať vlastnosti ostatných komponentov ako je napríklad validácia formulárov.

Kontrolér

Teraz budeme potrebovať prostredníka, ktorý nám dáta zobrazí. Ako už vieme, kontrolér na základe požiadavky od užívateľa vytvorí model a vygeneruje pohľad s dátami z modelu. My budeme zatiaľ potrebovať model Calculator az neho vypísať možné operácie kalkulačky. Samotný výpočet a odovzdanie výsledku si necháme na nabudúce.

Necháme si opäť jednoducho vygenerovať kontrolér s názvom CalculatorController cez nasledujúci príkaz v termináli / príkazovom riadku z koreňovej zložky projektu:

php artisan make:controller CalculatorController

Vygenerovaný kontrolér nájdeme v zložke app/Http/Controllers/ a teraz nič neobsahuje okrem definovanie triedy s názvom CalculatorController, dedičov z Controller. Definujme si metódu pre zobrazenie formulára s kalkulačkou:

<?php

namespace App\Http\Controllers;

use App\Calculator;
use Illuminate\Http\Request;
use Illuminate\View\View;

class CalculatorController extends Controller
{
    /**
     * Zobraz formulář s kalkulačkou.
     *
     * @param  Calculator $calculator
     * @return View
     */
    public function index(Calculator $calculator): View
    {
        return view('calculator', [
            'operations' => $calculator->getOperations()
        ]);
    }
}

Ako si môžete všimnúť, naša metóda (akcie) index() pre zobrazenie formulára s kalkulačkou obsahuje parameter $calculator typu Calculator. Toto získanie inštancie modelu v parametri prebieha automaticky vďaka dependency injection, ktorá podľa uvedeného typu spozná inštanciu aké triedy chceme odovzdať. Jednoducho si tak vyžiadame, aký model potrebujeme.

Vnútri metódy voláme len helper funkciu view() s dvoma parametrami. Jeden je pre zobrazenie zatiaľ neexistujúceho pohľade s názvom calculator.blade.php. Ďalej tejto funkcii odovzdávame polia s premennými, ktoré sa odovzdajú pohľadu. Pre nás sú to zatiaľ dostupné operácie kalkulačky pre formulár v pohľade. Poďme si teraz tento pohľad vytvoriť.

Pohľad

Pohľad si už musíme vytvoriť ručne v priečinku resources/views/. Tam môžeme tiež nájsť už předvytvořený pohľad s názvom welcome.blade.php. Všimnite si, že okrem názvu pohľadu a prípony .php názov súboru tiež obsahuje .blade. Takto sa označujú pohľady používajúci Blade šablónovacích systém. Jeho základné fungovanie sme si už popísali v úvodnej lekcii.

My si vytvoríme vlastný pohľad s názvom calculator.blade.php s nasledujúcim obsahom:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Kalkulačka</title>
    </head>
    <body>
        <h1>Kalkulačka</h1>

        <form method="POST" action="/calculator">
            Operace:
            <select name="operation">
                @foreach ($operations as $operation => $text)
                    <option value="{{ $operation }}">{{ $text }}</option>
                @endforeach
            </select>
            <br />

            První číslo:
            <input type="number" name="a" value="{{ $a ?? 0 }}" />
            <br />

            Druhé číslo:
            <input type="number" name="b" value="{{ $b ?? 0 }}" />
            <br />

            <button type="submit">Spočítej výsledek</button>
        </form>

        @if (isset($result))
            <p>Výsledek je: {{ $result }}</p>
        @endif
    </body>
</html>

Vývojári Laravel frameworku sa rozhodli vo verzii 6.0.0 presunúť štýly a ďalšie záležitosti front-end časti projektu do špeciálneho balíčka. Kvôli zjednodušeniu prvých lekcií sa týmto budeme zaoberať až v dieli Jednoduchý redakčný systém v Laravel - Štruktúra projektu, kedy začneme pracovať na reálne webovej aplikácii.

Ak pôjdeme krok po kroku, vytvoríme si najskôr POST formulár odkazujúce na /calculator. Túto route si nabudúce ešte vytvoríme. Vo formulári máme následne <select> element s operáciami našou kalkulačky. Pre ich vypísanie použijeme Blade notáciu @foreach (), ktorá vo výsledku nie je nič iné ako skrátená verzia <?php foreach (): ?>. Pre vypísanie premenné používame výraz dvojitých zložených zátvoriek, teda {{ }}, ktorý zobrazí a zabezpečí premenné skrze PHP funkciu htmlspecialchars() proti XSS útoku.

Ďalej vytvárame dva <input> elementy pre čísla. Tieto input boxy zobrazí premennú s číslom iba v prípade, že daná premenná existuje. Premenné budeme odovzdávať neskôr cez kontrolér pri spracovávaní formulára, preto sa nám toto ošetrovanie hodí, pretože môžeme ten istý pohľad použiť pre viac akcií. Konkrétne tu aj pre výpis výsledku, až bude formulár odoslaný.

Následne sa výsledok ukáže na konci stránky iba v prípade, že existuje premenná $result. Na toto zistenie opäť použijeme jednoduchú Blade notáciu, tentoraz však @if ().

Dostali sme sa ku koncu tejto lekcie. V budúcej lekcii, Dokončenie kalkulačky v Laravel , dokončíme kalkulačku sprevádzkovaním odoslaní formulára a tiež si ukážeme, aké jednoduché je vytvoriť validáciu pre formulár. Budete si tiež môcť stiahnuť jej zdrojové kódy pre prípad, že ste mali s niečím problém.


 

Predchádzajúci článok
Inštalácia Laravel a sprevádzkovanie projektu
Všetky články v sekcii
Laravel framework pre PHP
Preskočiť článok
(neodporúčame)
Dokončenie kalkulačky v Laravel
Článok pre vás napísal Jan Lupčík
Avatar
Užívateľské hodnotenie:
3 hlasov
Autor se primárně věnuje vývoji webových stránek a aplikací v PHP (framework Laravel) a je jedním z herních vývojářů komunitní modifikace TruckersMP.
Aktivity