IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

1. diel - Úvod do Doctrine 2 v Nette frameworku

Vítam vás v prvej lekcii kurze o technológii ORM (objektovo relačné mapovanie) v Nette frameworku. Táto technológia je konkurenčný klasickému získavanie tabuliek z databázy pomocou čistého SQL alebo nejakej jeho nadstavby ako napr. Dibi a umožňuje pracovať s relačná databázou objektovo. Séria vám technológiu, ktorá sa v komerčných aplikáciách často využíva, predstaví na systéme pre správu obsahu, kde použijeme asi najznámejšie ORM knižnicu pre PHP - Doctrine 2. Osobne nemám rád dlhé slohy, ale pár slov na úvod je potrebné povedať.

Články budú mať za úlohu zoznámiť vás s použitými technológiami a ukázať, akým ďalším spôsobom možno napísať webovú aplikáciu. Nebudú preto vysvetlené všetky detaily týkajúce sa použitých technológií, ale ukážu vám postup pri vývoji.

Je preto potrebné mať aspoň základnú znalosť:

  • frameworku Nette
  • šablonovacího systému Latte
  • OOP v PHP (výnimky, menné priestory, rozhranie atď.)
  • znalosť Doctrine 2 či iného ORM je výhodou (ale pochopíte ju počas seriálu, odporúčam aj priebežne sledovať dokumentáciu)

V článkoch budú uvedené okrem iného aj vlastné názory, prípadné klady alebo zápory použitého algoritmu a tak podobne. Dúfam, že pre vás budú prínosné a otvoria vám nové možnosti. :-)

Systém bude vedieť:

  • registráciu a prihlásenie užívateľa
  • spravovanie kategórií (vytváranie, úprava, mazanie, schvaľovanie)
  • spravovanie článkov (vytváranie, úprava, mazanie)
  • správu užívateľov (vytváranie, úprava)
  • role užívateľ / admin
  • preklad do cudzích jazykov
  • nastavenia účtu (v podstate len opis používateľa)

Pre lepšiu predstavu si ešte ukážme aspoň 2 screenshoty z hotového systému:

Detail článku Nette a Doctrine CMS - Cms v Nette a Doctrine 2
Administrácia používateľov v Nette a Doctrine CMS - Cms v Nette a Doctrine 2

Predstavenie technológií

Pri tvorbe systému budú použité tieto technológie:

Framework Nette

Nette je český framework využívajúci architektúru MVP (Model-View-Presenter). Obsahuje ale iba vrstvy VP, pre modelovú má len databázový wrapper. Je preto čisto na vývojári, ako si modelovú vrstvu zostaví. Vďaka tomu máme veľmi dobrý základ pre našu aplikáciu - nemusíme sa takmer starať o bezpečnosť aplikácie, cachovanie a vôbec väčšinu nudných, avšak dôležitých vecí za nás framework urobí sám, a my sa tak môžeme plne sústrediť na samotné úlohy.

S pomocou frameworku teda môžeme ušetriť veľa času a to v reálnej aplikácii znamená zarobiť viac peňazí. Iné frameworky som (v čase, keď som písal článok) neskúšal, ale som presvedčený, že je Nette veľmi kvalitným frameworkom s dobrou komunitou. Len je škoda, že bola dokumentácia veľmi dlho iba v slovenčine, a tak sa príliš nedostal do sveta.

Doctrine 2

Doctrine je tzv. ORM, čiže objektovo relačné mapovanie (object-Relational mapping), ktorého cieľom je mapovať objekty na relačnú databázu. Doctrine však vie oba smery (z entít urobiť štruktúru databázy a naopak zo štruktúry databázy vytvoriť kostru entít).

S týmto nástrojom môžeme v podstate zabudnúť, že máme nejakú databázu. Všetka naša práca s dátami sa týka objektov, SQL príkazy vôbec nie sú potrebné - ORM sa o to postará samo.

DQL

Doctrine má aj vlastný dopytovací jazyk nazvaný Doctrine Query Language. Syntaxou sa veľmi podobá SQL, ale rozdiel je v tom, že miesto s tabuľkami a stĺpci pracujeme s objektmi a ich atribúty.

Príklad použitia DQL:

// takto by vypadal SQL dotaz do databáze
SELECT `name`, `email`, `ip`
FROM `user`
WHERE `id` > 10
ORDER BY `name` DESC

// a takto příkaz vypadá v DQL
SELECT u
FROM Jmenny\Prostor\User u
WHERE u.id > 10
ORDER BY u.name DESC

Veľmi podobné, že? DQL obsahuje aj pokročilejšie konštrukcie, ako je radenie, zoskupovanie atď. Je potrebné vytvoriť si alias pre vybrané entity (v naše prípade písmeno 'u'). Defaultne sa entita načíta celá, keď ale chceme len niektoré dáta, využijeme na to kľúčové slovo partial.

Entita

Entita je objekt nesúci dáta. Nemá prístup k databáze ani k iným dátovým úložiskám. Jej úlohou je uchovávať a odovzdávať dáta. Keďže by ale nemala byť obyčajnou prepravkou, môže (a mala by) obsahovať aj validáciu vstupu, ako je napríklad ošetrenie dĺžky odovzdávané hodnoty atribútu. Tiež môže obsahovať ľubovoľné metódy pracujúce s dátami, ktoré jej patrí. Všetky informácie o entite samotnej a ich atribútoch zapisujeme pomocou anotácií.

Entity manager

Ako z názvu vyplýva, jedná sa v podstate o správcu entít. Jeho úlohou je ukladať nové entity (tzv. Perzistencie), odpájať je z frontu a alebo ich úplne zmazať. Všetky entity, ktorých dáta sa majú nejakým spôsobom prejaviť v databáze (či je to SELECT, INSERT, UPDATE alebo DELETE), musí byť pod správou Entity manageru.

Aj keď by sa mohlo zdať, že sa stará o prácu s databázou, v jeho hlbinách sa skrýva objekt využívajúce vzoru Unit of work (rovnako tak sa aj volá), ktorý túto úlohu zastáva. Obsahuje front všetkých zmien a po príkaze všetky zmeny vykoná aj v databáze.

Keďže sa jedná o automatizáciu, máme tu aj jednu nepeknú nevýhodu - všetky zmeny v databáze sú vykonané podľa určitého poradia (napr. Prvýkrát je INSERT, potom UPDATE pod.), Čo môže niekedy vyvolať nechcené správanie (napr. Že sa vymaže práve vytvorený záznam , pretože zodpovedá podmienke v DELETE). Všetky nové entity je potreba dostať pod správu Entity manageru príkazom Persist (). Ak chceme všetky zmeny vykonať aj v databáze, musíme použiť príkaz flush ().

Jednoduchá ukážka práce entity s Entity managerom:

// každou entitu je potřeba označit anotací Entity
/**
 * @ORM\Entity
 */
class User
{
    // všechny atributy je potřeba označit anotací @Column, do závorky poté udáváme údaje, jako je datový typ, délku, možnost nullable atd.
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     */
    private $name;


    // obyčejný setter, ve kterém můžeme využít i jednoduchou validaci
    public function setName($name)
    {
        if (strlen($name) > 15) {
            throw new Exception("Name is too long");
        }

        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    // jelikož entita nemá být pouhou obálkou na data, může vykonávat i jednoduché operace
    public function getFullId()
    {
        return "{$this->name}#{$this->id}";
    }

}

// předpokládejme, že máme Entity manager nakonfigurovaný
$user = new User();
$user->setName("Martin");

$entityManager->persist($user);  // uložíme objekt do fronty, zatím se s databází nic nestane
$entityManager->flush();  // provede všechny změny - v našem případě vytvoří nový záznam v tabulce user (odvozen z názvu entity), nový záznam bude mít ID 1

$userFromDb = $entityManager->find("User", 1);  // User je název entity, 1 je ID
echo $userFromDb->getFullId();  // Martin#1

Všimnite si, že entita nevie komunikovať s databázou. Doctrine 2 sa odprostila od vzoru ActiveRecord a využíva teraz vzor DataMapper.

Doctrine je rozsiahly nástroj, tu som načrtol len veľmi stručne hlavné pojmy. Oveľa viac sa dozviete v samotnej dokumentácii.

Rozšírenie Keby

Keby je rozšírenie Nette frameworku, ktoré obsahuje veľa užitočných nástrojov. V našom seriáli použijeme Keby \ Translation na preklad textov a Keby \ Doctrine na uľahčenie práce s Doctrine.

Architektúra aplikácie

Vrstvy View a Presenter má Nette zabudované v sebe, do tých radšej zasahovať nebudeme. Dôležité ale je navrhnúť si modelovú vrstvu. Naša bude vyzerať takto:

  • Entity - objekty prepravujúce dáta
  • Fasády - tzv. Služby (services), ktoré vykonávajú určité úkony (ukladanie záznamov, editácia, získavanie atď.), V aplikácii je vždy len jedna inštancia danej fasády a majú koncovku Facade
  • Pomocné triedy pre skladanie otázok - uvidíte počas seriálu, možno s nimi efektívne skladať DQL otázky, majú koncovku Query
  • Form factories - triedy pre vytváranie a spracovávanie formulárov, majú koncovku FormFactory

Presenter budú pracovať s fasádami a tie budú pracovať s Entity managerom. Preto nikdy v prezentačného neuvidíte objekt triedy EntityManager, ale iba príslušné fasády. Všetky závislosti (či v Presenter, fasádach alebo form factories) bude automaticky obstarávať DI container Nette.

Všetky Presenter budú v mennom priestore App \ presenters, modelové triedy App \ Model a formuláre App \ Forms.

Aby sme nemali v Presenter úplný neporiadok, budeme písať atribúty a metódy týmto spôsobom:

  • prvýkrát atribúty
  • action a render metódy pre danú stránku pod seba (actionStranka, renderStranka, actionStranka2, renderStranka2 atď.)
  • spracovanie signálov (handle<Signal>)
  • vytváranie komponentov (createComponent<Component>)

Adresárová štruktúra

Štruktúra zostáva rovnaká podľa Nette, len do zložky app / pridáme zložku lang /, do ktorej budeme pridávať jednotlivé súbory slúžiace pre preklad.

koreňový adresár

koreňový adresár - Cms v Nette a Doctrine 2

Zložka app /

Zložka app / - Cms v Nette a Doctrine 2

Zložka presenters /

Zložka presenters / - Cms v Nette a Doctrine 2

To bude z prvej lekcie všetko. Chápem, že obsahovala veľa teórie, ale bez pár úvodných slov to bohužiaľ nejde. Nabudúce, v lekcii Cms v Nette a Doctrine 2 - Kostra aplikácie , vytvoríme základnú štruktúru našej aplikácie.


 

Všetky články v sekcii
Cms v Nette a Doctrine 2
Preskočiť článok
(neodporúčame)
Cms v Nette a Doctrine 2 - Kostra aplikácie
Článok pre vás napísal Martin Konečný (pavelco1998)
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se o IT moc nezajímá, raději by se věnoval speciálním jednotkám jako jsou SEALs nebo SAS. Když už to ale musí být něco z IT, tak tvorba web. aplikací v PHP. Také vyvýjí novou českou prohlížečovou RPG hru a provozuje osobní web http://www.mkonecny.cz
Aktivity