Jak začít s PHP Jet

1. Pusťte z hlavy ostatní frameworky ;-)

PHP Jet není jen "další" PHP framework. PHP Jet řeší řadu věcí jinak (a já věřím, že pro většinu situací lépe) než ostatní frameworky. Například zde nenajdete žádné "routy", žádný šablonovací systém, ale ani žádné nestandardní postupy a technologie či datové formáty. PHP Jet staví pouze na standardním PHP 8 a standardních obecně platných postupech SW vývoje.

PHP Jet nemá žádné závislosti na čemkoliv (ani na composeru, které je možné, ale ne nutné použít) krom CSS frameworku Bootstrap, který standardně využívá, ale který je možné "vyměnit" za něco úplně jiného. PHP Jet nepotřebuje žádné zvláštní (nestandardní) nastavení webserveru či běžného webhostingu.

Pro práci s PHP Jet se nebudete muset učit moc nových věcí, krom znalosti PHP samotného a pochopení filozofie tohoto frameworku. PHP Jet je maximálně jednoduchý.

PHP Jet je co se týká objemu / velikosti zdrojových kódů relativně malý a ve své podstatě velice jednoduchý, ale o to je mocnější. Již v základu je k dispozici plnohodnotná ukázková aplikace obsahující základ všeho, co standardní webový projekt potřebuje a v neposlední řadě je součástí Jet Studio, kde si vše "otravné" můžete (ale nemusíte) prostě a pohodlně "naklikat".

Právě v čistotě a maximální flexibilitě návrhu SW architektury je síla PHP Jet, která umožní tvořit kvalitní online aplikace mnohem efektivněji a přímočařeji. Při 12 let trvající evoluci PHP Jet jsem nekladl důraz na přidávání dalších a dalších funkcí, ale na ověření zda je daný návrh opravdu dobrý pro praktické použití ve skutečném světě a to i za cenu toho, že některé funkce jsem naopak odstranil. Je to framework který vznikl v praxi a který vytvořil člověk z praxe a uvolňuji jej až po té, co jsem jej praxí prověřil.

Ale pro správné pochopení PHP Jet je nutné odpoutat se od řady dogmat, která vznikla zejména v poslední dekádě.

Je třeba mít otevřenou mysl, protože není důležité "našprtat se" jak se co dělá, ale správně pochopit co a jak funguje a proč. Pokud pochopíte ve své podstatě vlastně směšně jednoduchou filozofii PHP Jet, tak si tento framework již osvojíte snadno a rychle a věřím, že vám bude dobrým parťákem na vašich projektech.

2. Instalace

Pokud si chcete PHP Jet zatím jen osahat, pak je postup velice jednoduchý:

  • Ujistěte se, že máte nainstalované PHP 8, včetně všech běžných modulů INTL, PDO a mbstring.
  • Stáhněte si balíček z GitHub a ten rozbalte.
    nebo
    Můžete použít composer: composer create-project mirekmarek/php-jet
  • Přejděte do adresáře, kde máte stažený a rozbalený PHP Jet.
  • Spusťte: php _playground/start.php
  • Ve vašem prohlížeči otevřít URL http://localhost:8000/ (pokud jste při spuštění hřiště neurčili jinou adresu a port).
  • Pokud chcete, pak si můžete pro účel testování vytvořit nějakou testovací databázi na MariaDB/MySQL (v brzké budoucnosti i PgSQL, Oracle a MS SQL), ale není to nutné. PHP Jet podporuje i SQLite a to pro účel testování stačí.
  • Dokončete instalaci pomocí webového instalátoru.

Zprovoznění na plnohodnotném webovém serveru (Apache, NGINx) je rovněž jednoduché. Viz dokumentace.

3. Rychlé seznámení s ukázkovou aplikací

Po té co se "proklikáte" instalátorem (což je mimochodem obecný základ instalátoru, na jehož základě můžete vytvořit váš instalátor - pro váš SW produkt), pak spatříte celou ukázkovou aplikaci, která zahrnuje:

  • Jednoduchý web obsahující mnoho podstránek, které většinou představují demonstraci standardních schopností PHP Jet a zároveň test různých funkcí ať je to lokalizovatelnost, formuláře, ORM, či REST serveru i klienta a tak dále.
  • Neveřejnou ("zaheslovanou") část webu pro demonstraci a test možností autentizace a autorizace i s provázáním na Jet MVC.
  • Administraci s řadou modulů (např. pro správu uživatelů a rolí, prohlížení logů, ale i primitivní základ CMS).
  • REST API server a zároveň i klient pro otestování.
  • Velice nápomocné vývojářské prostředí Jet Studio s webovým grafickým UI.
  • Integrovaný profiler.
  • ... A to vše rozdělené do aplikačních modulů (mikroaplikací), aby v projektu byl řád. Ukázková aplikace samozřejmě plně využívá unikátní filozofii Jet MVC, samozřejmě ORM DataModel a celou řadu dalších schopností frameworku PHP Jet.

Vše je nachystáno tak, že můžete rovnou vše zkoumat, zkoušet, měnit, prostě si "hrát". Rovnou máte k dispozici základ reálné aplikace úhledně rozdělené do jasné struktury.

4. První "routa"

Jak jsem již psal - PHP Jet nemá žádné routy v tom smyslu jak je znáte z jiných frameworků. V PHP Jet prostě neplatí, že URL se váže na nějakou routu, která se váže například na nějaký kontroler (ale nebojte, kontrolerů je v PHP Jet opravdu požehnaně ;-) ).

Jak funguje Jet MVC je téma samo o sobě, ale zde se pokusím o pokud možno stručné vysvětlení:

  • URL požadavku nepřestavuje žádnou "routu", ale URL báze a stránky.



  • Báze určuje o jakou část aplikace se jedná. Je to administrace? Je to REST API (nebo jiný API) server? Jeto pro návštěvníky viditelný web? Či cokoliv dalšího? (počet bází není omezen)
    A jaké má tato část webu lokalizace a jakou lokalizaci přestavuje daná URL?

  • Báze má nějakou základní URL, která koresponduje i s lokalizací.
    Tedy například URL
    https://nejlepsi-eshop.cz
    představuje cs_CZ lokalizaci e-shopu zatímco URL
    https://najlepsi-eshop.sk
    lokalizaci slovenskou.

    Ovšem to platí pro produkční prostředí. Při vývoji může být URL těchto bází a lokalizací klidně třeba
    http://locacalhost/nejshop/cz/
    a
    http://locacalhost/nejshop/sk/

    Stačí změnit definici báze - nic víc.

  • Stejně jako stránka (to si za chvíli ukážeme) je báze entita (=něco komplexnějšího, ne pouhá definice routy), se kterou se dá různě pracovat. Zde je malý příklad: /*
     * Výpis lokalizací učité báze s rozdělením na aktivní / neaktivní
     */
    $base MVC::getBase(\'some-base\');

    foreach($base->getLocales() as $locale) {
        if($base->getLocalizedData($locale)->getIsActive()) {
            echo \'Lokalizace \'.$locale->getName().\' je aktivní<br>\';
        } else {
            echo \'Lokalizace \'.$locale->getName().\' není aktivní<br>\';
        }
    }

    /*
     * Získání URL hlavní stránky (homepage) určité báze v české lokalizaci
     */

    $locale = new Locale(\'cs_CZ\');
    $URL = MVC::getBase(\'some-base\')->getHomepage( $locale )->getURL();

    /**
     * Získat obecný titulek báze v české lokalizaci
     */
    $locale = new Locale(\'cs_CZ\');
    $title = MVC::getBase(\'some-base\')->getLocalizedData( $locale )->getTitle();
    Mnohem více najdete v doumetnaci.

  • Pod bázemi jsou již jednotlivé stránky. Například reklamační formulář může mít na produkci URL v cs_CZ lokalizaci

    https://nejlepsi-eshop.cz/reklamace/
    Na sk_SK mutaci
    https://najlepsi-eshop.sk/reklamacia/

    Ovšem pro vývoj mohou být URL klidně
    http://locacalhost/nejshop/cz/reklamace/
    a
    http://locacalhost/nejshop/sk/reklamacia/

Poznámka

A než se dostaneme dál tak se zastavíme u jedné důležité věci a jádra celé myšlenky. Určitě vaší pozornosti neunikl fakt, že URL je věc proměnná! Tatáž stránka (zde např. reklamační formulář) je vždy stejná z pohledu logiky aplikace - o ten pomyslný reklamační formulář se vždy stará tatáž mikro-aplikace / aplikační modul ať se nachází na jakékoliv URL. Mění se pouze lokalizace a také URL podle toho zda je stránka zrovna na localhostu, na testovacím prostředí či na produkci. Nehledě na to, že zákazník (zadavatel projektu) se kdykoliv může rozhodnout URL změnit.

Proto platí:

URL požadavku / stránku není pevná / konstantní hodnota - kdykoliv se může změnit a je tedy nesmysl integrovat takovou entitu do aplikační logiky. Napojovat aplikaci přímo na URL tak, že v rámci aplikaci budu definovat nějaké routy je špatná cesta.

Navíc celý problém není pouze o URL. Na stránky je nutné odkazovat v rámci navigace, stránky musí mít celou řadu metainformací a tak dále. Proto PHP Jet v toto ohledu může připomínat spíše nějaké CMS, ale je to pouze jiný pohled na problematiku. A je to pohled, který více koresponduje s reálným světe a je mnohem flexibilnější a pohodlnější než nějak zapisovat "routy" a třeba je i pojmenovávat.

Ale vraťme se zpět. Mé tedy již bázi, určenou lokalizaci a stránku. Co dál?

  • Stránka má rozvržení - layout (Poznámka: Pokud se nejedná o API server, či cokoliv co posílá zpět data a ne HTML výstup určený pro koncového uživatele - např. pro REST API níže uvedené samozřejmě neplatí. Ale teď řešme běžnou stŕanku.)

  • V rámci layoutu jsou definovány jednotlivé pozice.

  • Na tyto pozice je napojen obsah:



  • Obsah na jednotlivých pozicích může být klidně statický (prostě statický kus HTML určený definicí), ale nejčastěji na danou pozici vázán nějaký aplikační modul / mikro-aplikace.

  • Například na levé části stránky může být menu zobrazené jedním modulem, nad stránkou je drobečková navigace vygenerována jiným modulem a uprostřed zobrazený článek o který se postaral další modul. Aplikační modul je vlastně mikroaplikace spouštěná v rámci stránky. A pozice si pochopitelně můžete definovat jak libo.

  • Jednotlivé aplikační moduly / mikro-aplikace již mají své kontrolery a své view.

  • Se stránkami lze různě operovat. Stránka není žádná pouhá "pojmenovaná routa" (například), ale je to mnohem víc. Je to entita pomocí níž lze vytvářet odkazy, operovat s meta informacemi a tak dále - je toho opravdu hodně, viz dokumentace.
    Příklady: /*
     * Získání URL konkrétní stránky (aktuální báze a lokalizace)
     */
    $URL MVC::getPage(\'reclamation\')->getURL();

    /*
     * Získání titulku pro menu konkrétní stránky (aktuální báze a lokalizace)
     */
    $title = MVC::getPage(\'reclamation\')->getMenuTitle();

    /**
     * Vložení meta tagu do aktuální stránky
     */
    $custom_meta_tag = Factory_MVC::getPageMetaTagInstance();
    $custom_meta_tag->setAttribute(\'name\');
    $custom_meta_tag->setAttributeValue(\'author\');
    $custom_meta_tag->setContent(\'Jára Cimrman\');

    MVC::getPage()->addMetaTag( $custom_meta_tag );

  • Mimochodem ... Stránka nemusí mít nutně layout a asociované aplikační moduly. I v PHP Jet může být stránka (tedy nějaká URL) nasměrována přímo na nějaký kontroler, obdobě jako v jiném frameworku (ovšem báze a stránky jsou přítomné stále). Ale není to hlavní směr uvažování o aplikaci. Je to pouze možnost pro situaci, kdy by bylo takové řešení vhodnější. V PHP Jet se předpokládá, že co je pro daný projekt správné ví nejlépe vývojář daného projektu a ne framework.

Sliboval jsem první "routu" a ona žádná nebude. Pardon ... Ale víte co? Zkuste si v Jet Studiu udělat první stránku. Věřte, že je to mnohem lepší a pro naší práci mnohem přirozenější než všeobecně používané routy.

5. Lokalizovatelnost

Jistě jste si již všimli, že lokalizovatelnost je integrální součástí PHP Jet. Již Jet MVC s lokalizovatelností aplikace pevně počítá. A tedy samozřejmě nesmí chybě ani překladač, či formátování informací dle národních zvyklostí.

6. Aplikační moduly / mikro-aplikace

I neustále opakované téma aplikační moduly vám neuniklo. Poslední dobou se hodně mluví o architektuře mikro-služeb. Vězte, že toto je vlastně to samé. Je to stejná filozofie a stejné benefity - rozdělení projektu do malých snadno udržovatelných a ideálně znovu použitelných mikro-aplikací. To je PHP Jet sám o sobě - je tak přímo od počátku vymyšlen a navrhnut. Pouze není nutné vytvářet žádnou složitou serverovou infrastrukturu pro běh takové aplikace. (V extrému co služba to vlastní server. To u 99% projektů vůbec není nutné.)

7. ORM

Integrované ORM DataModel je typické především v tom, že je to doopravdy ORM. Tedy na datové entity nekouká z perspektivy datových tabulek v relační databázi a SQL, ale z perspektivy tříd. Když navrhujete (naklikáváte v Jet Studiu - proč to dělat ručně?) například entitu představující článek, či zboží v e-shopu, pak se uvažuje především v rovině tříd a jejich uspořádání. DataModel se pak postará o takové ty "otravné" věci jako je ukládání, načítání, aktualizace a mazání dat.

Nehledejte nic jako adresář migrations. Definice entit (toho jak jsou uložené v databázi) jsou tam kde mají být - přímo ve třídách entity reprezentující. Což ale není zas tak unikátní - v tom PHP Jet originální není a podobá se například Doctrine.

Základní filozofie je sice obdobná, ovšem na rozdíl třeba od zmíněné Doctrije je Jet DataModel mnohem menší a jednodušší, řadu věcí řeší mnohem jednodušeji a zároveň je k dispozici nástroj v rámci Jet Studia, kde je možné si entity "naklikávat". Například Jet DataModel nepotřebuje nic jako Entity Manager, proxy třídy a tak dále. Použití DataModel je maximálně přímočaré, přirozené a jednoduché.

Příklad? Zde jsou:

/* 
 * Získání článku podle ID
 */
$article Content_Article::get$id );

/* 
 * Změna data článku:
 */
$article->setDateTimeData_DateTime::now() );
$article->save();


/*
 * Získání instancí všech článků 
 */
$articles Content_Article::fetchInstances();

/* 
 * Získání instancí článků, které jsou vytvořené před rokem a v jejich 
 * LOKALIZOVANÉ titulku se vyskytuje slovo PHP nebo Jet
 * s použitím VNITŘNÍ RELACE entity
 */
$articles Content_Article::fetchInstances(
    
where: [
        \
'date_time <=\' => new Data_DateTime(\'-1 year\'),
        \'AND\',
        \'article_localized.title *\' => [\'PHP\', \'Jet\']
    ]
);

/*
 * Vytažení mapy titulků článků v české lokalizaci. (Klíč pole = ID článku, povek = titulek)
 */
$articles = Content_Article_Localized::dataFetchAssoc(
    select: [\'article_id\', \'title\'],
    where: [
        \'locale\' => new Locale(\'cs_CZ\')
    ]
)

ORM DataModel je navržené tak, aby bylo možné dosáhnout co nejlepšího výkonu aplikace. Nabízí tedy různé možnosti jak například nahrávat data (částečné načtení, načtení surových dat, načtení pomocí různých postupů, ...) a tak dále.

Při správném pochopení ORM DataModel je možné vyvíjet velice výkonné aplikace, přenositelné na různé databázové systémy a zároveň si ušetřit opravdu velké množství rutinní a otravné práce. Ovšem DataModel se vám neplete do práce a nesnaží se za vás přemýšlet!. Pomáhá vám s rutinou a přemýšlení nechává na vás - vy víte nejlépe co a proč děláte.

Pokud chcete, tak koukněte do Jet Studia a naklikejte si vlastní entitu, nebo si upravte nějakou z těch, které již ukázková aplikace má. Je to jednoduché, naprosto jednoduché.

8. Konfigurace

Konfiguraci jste již provedli a to "naklikáním" ve webovém instalátoru.

Jet má dvě úrovně konfigurace. Základní je konfigurace samotné platformy. Ta slouží k nastavení takových věcí jako je zapnutí / vypnutí vývojářského režimu, keše a řady dalších věcí. Nic zvláštního ...

Ovšem v instalátoru jste vyplňovali několik formulářů. Například jste vytvářeli databázové spojení, ale nejen to. A to už je zajímavější ;-)

PHP Jet má systém konfigurace aplikace. Jde o to, že si můžete vytvářet konfigurační entity (třídy s definicí konfigurace) a na ně vázat formuláře a pak velice jednoduše vytvářet například onen instalátor, kterým jste prošli.

9. Formuláře

A práce s formuláři pochopitelně nesmí v PHP Jet chybět. Je to další velice rozsáhlé téma, protože podpora formulářů je v PHP Jet opravdu velice propracovaná - ale v principu stále velice jednoduchá.

Co to umí?

  • Samozřejmě základní definice formuláře a jeho polí pomocí příslušných tříd.
  • Jsou předimplementovány všemožné typu polí, ale nic vám nebrání implementaci změnit, či si vytvořit nové typy polí.
  • Zachycení vstupních dat (a to i například z REST požadavku), validace dat, práce s chybami a rovněž zabezpečení vstupu.
  • Napojení na překladač lokalizace - překlad všeho od popisků polí po chybové hlášky.
  • Systém pro snadné, unifikované, ale stále velice flexibilní zobrazování formulářů.
  • Mapování formulářů přímo na třídy.
  • Nástroj pro naklikání definic formulářů mapovaných na třídy v Jet Studiu.


10. A tak dále ...

A to zdaleka není vše co Jet umí ... Je toho víc:

  • Díky systému továren máte možnost vyměnit "střeva" PHP Jet za své vlastní implementace aniž by přestala fungovat aplikace. Nevyhovuje vám například jak je implementována MVC stránka? Nic vám nebrání vytvořit si svou implementaci a jednoduše ji vložit do systému a zároveň zachovat celou filozofii a funkčnost.
  • Systém autorizace a autorizace je také velice zajímavý.
  • Žádný vývojář by rozhodně neměl zapomenout používat profiler.
  • Nechybí usnadnění obecné práce s navigací aplikace.
  • Součástí Jet je i systém pro generování UI na straně serveru a samozřejmě i podpora AJAX.
  • A řada dalších užitečných věcí jako je posílání e-mailů, práce s obrázky, práce se stromovou strukturou dat, a tak dále, ...

Pokud se budete chtít na něco zeptat, tak v nedávné době jsem aktivoval diskuze na GitHub, kde vám určitě rád odpovím, případně stále můžete kontaktovat přímo mou maličkost.

Díky za přečtení a věřím, že vám PHP Jet zpříjemní vaší práci!