Hlavní navigace

Jet - nový PHP8 framework #3 - MVC - ne, fakt to není CMS :-)

8. 11. 2022 21:06 Mirek Marek

V minulém díle jsem „z rychlíku“ ukázal jak co zhruba Jet obnáší. A pochopitelně to vzbudilo reakci, kterou jsem tak trochu očekával. Tedy to co jsem předvedl mohlo budit dojem, že Jet je nějaké CMS. A ne, Jet opravdu není CMS.

CMS jsou více či méně zaměřené na určitý účel (a ano, vím, že existují možnost jak z něčeho co bylo CMS udělat třeba e-shop). CMS mají ve svém jádru relativně pevně daná pravidla, pro svůj běh často nutně potřebují databázi. V CMS jsou definovány příspěvky, uzly, rubriky, články a tak dále – prostě jsou to systémy pro správu obsahu.

PHP Jet sám o sobě nic takového nemá. Je to framework na kterém je možné postavit jakoukoliv online aplikaci bez nutnosti cokoliv ohýbat a případně někdy tak trochu „tlačit“ proti původnímu smyslu systému. Na Jet je možné snadno vyvinout web, e-shop, ale i informační systém, REST API server (pochopitelně i klient), ale nejen to – opravdu jakoukoliv online aplikaci. 

Ano, Jet je distribuován jako balíček s ukázkovou / základní aplikací. A to z toho důvodu, že na příkladech se nejlépe demonstruje co to umí, jak se s tím pracuje a v neposlední řadě ta ukázková aplikace je koncipována jako typizovaný příklad a základ. Tedy základ něčeho, co zahrnuje klasický projekt a je jedno zda je to portál, nebo e-shop, případně něco jiného. Klasicky máme něco co vidí koncový uživatelé / návštěvník, nějakou administraci, nějaké REST API či servisní skripty, nějaké řízení práv, nějaké logování. Ale jak to všechno bude vypadat při spouštění vašeho projektu do provozu je pouze na vás. PHP Jet sám o sobě je opravdu „pouze“ framework. Ano, framework, který rovnou zahrnuje šikovné nástroje, ale stále „pouze“ framework. A to framework, který ve skutečnosti nabízí obrovskou svobodu, který nic nediktuje, ale nabízí různé možnosti jak s jeho pomocí řešit různé situace.

A jakožto MVC framework musí mít PHP Jet něco, co by se dalo nazvat routováním. Nebo lépe řečeno mechanismem, který URL požadavek přetransformuje ve vykonání určitého kódu. Pojďme si to ukázat.

Báze – aneb základ a jednoduché „Ahoj světe!“

Báze – termín který jsem vymyslel po dlouhém bádání jak to sa**a vlastně nazvat? Vrátím se k tomu co jsem již psal. Klasický projekt má několik částí. Dejme tomu, že web má minimálně návštěvnickou část a pak nějakou administraci, kde mohou zaměstnanci vašeho klienta třeba psát novinky, nebo upravovat produktovou nabídku a podobně. Klasika, známe to. Ale z hlediska online aplikace jsou to vlastně dvě různé aplikace tvořící jeden projekt. Do administrace se budou přihlašovat úplně jiní uživatelé než do sekce pro firemní zákazníky, jinak bude probíhat kontrola práv, jiné bude logování operací a jiné bude i tzv. „routování“ z hlediska MVC. Úplně jiné bude UI/UX. Dokonce může být i jiná skladba jazykových mutací (koncový web třeba v pěti lokalizacích, administrace v angličtině, či češtině ovšem s nutností spravovat těchto pět lokalizací webu) a tak dále a tak dále. No a případné REST API pro příjem objednávek (či cokoliv jiného) – to už je další „písnička“. To se opět bude chovat úplně jinak ač je to součástí stejného projektu a také to využívá Jet MVC.

Co s tím? No rozhodně se potřebujeme od něčeho „odpíchnout“. Ač se projekt skládá z různých subaplikací a subprojektů, tak každý tento prvek musí mít:

  • Základní URL na které se daná subaplikace vyskytuje. (URL může být víc, ale jedna je samozřejmě výchozí – teď to tedy nekomplikujme).
  • Lokalizace ve kterých subaplikace poběží.
  • Inicializaci která se postará například o použití správného kontroleru pro autentizaci a autorizaci, ?řešení dalších závislostí a správného nastavení systému.

Pojďme si takovou bázi vytvořit. Pro začátek bude úplně jednoduchá a vypíše klasické „Ahoj světe!“ a pak z báze uděláme úplně primitivní webovou službu pro sčítání čísel. Jde čistě jen o demonstraci jak bázi vytvořit. Tentokrát nepůjde o reálné praktické použití:

Důležité je, že báze je definice. A je to adresář. Není to žádný záznam v databázi a tak dále. Je to základní definice a vstupní bod pro „routování“. Více se dočtete zde a zde.

Stránka – moderní retro, ale velice mocné

Pamatujete jak se to dělalo dřív a někdy stále dělá? Potřebovali jsme stránku s kontakty, tak se prostě vytvořil skript kontkaty.php a tak vznikla nová stránka s firemními kontakty. Nechám stranou, že v takovém skriptu kdysi zcela běžně byl špagety-kód, to nechme samozřejmě historii.

A víte co? Ono to nebylo tak úplně špatný (teď fakt nemyslím ten špagety-kód). Stránka vznikla rychle, jasně, nic složitého, žádná raketová věda. A ta stránka mohla dělat cokoliv. Ale jasně, mělo a má to obrovskou spoustu nevýhod. Například navigace aplikace, konzistence aplikace, „hezké URL“ a tak dále. Ano, není to ideální způsob, ale ta naprostá jednoduchost je vlastně fajn.

Zde mi dovolte malou odbočku. Před nějakou dobou jsem byl na schůzce s kolegou z jedné nejmenované firmy, kde používali jeden nejmenovaný framework. A klient potřeboval web agregující informace o určitých institucích a chtěl, aby URL byla tvořena podle jím určeného principu. Kolega tenkrát říkal: „Hmmm … Jak vyřešíme ty URL? To bude oříšek!“ Problém byl totiž v tom, že daný framework který používali si kladl podmínky, jak má URL vypadat a jak s ní bude pracovat – URL byla sice hezká, vlastně vázána na aplikační logiku. To je opačný extrém k prostému vytvoření skriptu „kontakty.php“. A je to jeden s tisíce důvodů, proč jsem vytvořil Jet. Je naprosto nepřijatelné aby framwork cokoliv pevně diktoval a bylo nutné lámat si hlavu s tím, jak vyřešit něco co je v podstatě triviální a naprosto samozřejmé.

Zpět k Jetu. V Jetu existuje pojem stránka a nejen pojem, ale entita stránka. Vlastně v základu je to stejně primitivní jako vytvořit onen skript „kontakty.php“, dá se to naklikat v Jet Studiu (jak jinak), ale na rozdíl od toho dřevního přístupu to řeší tisíc různých starostí a zároveň to neklade vůbec žádná omezení. Stránku už jsem vytvářel v minulém díle, ale teď si ukážeme jednotlivé situace z praxe:

Stránka se statickým obsahem

Zeptám se takhle: Opravdu musí pro vypsání nějakých statických informací existovat nějaká třída, routa kdesi v inicializaci, nebo jakýkoliv kus kódu? Nemyslím si. Ukážeme si, že to jde i bez toho. A ukážeme si to na reálném příkladu z praxe. Pro jednoho z mobilních operátorů jsme kdysi (ještě v předchozích fázích kariéry) vytvořili portál na našem CMS. Tento operátor velice často vytvářel marketingové akce a pro ně potřeboval tzv. landing page. Tyto stránky však nenavrhovala a netvořila naše agentura, ale jiné spolupracující firmy, které dodaly již hotové HTML (a vše ostatní). Naším úkolem bylo tyto landing page zakomponovat do webu / portálu, vytvořit na ně případně odkazy a tak dále. Taková landing page mohla buď využít základní layout webu, nebo mohlo jít o statickou samostatnou „celostránku“. Pojďme se podívat jak takovou situaci řešit pomocí Jetu (a to i když Jet fakt není CMS ;-) )

Než se přesuneme k něčemu zajímavějšímu, tak mi dovolte zdůraznit, že toto vše vzniká pouze díky definicím. Tyto definice nejsou nikde v databázi (jak to bývá u CMS) a tak dále. Každá stránka má svou definici v podobě adresáře a souboru, který si můžete naklikat v Jet Studiu, nebo vytvořit ručně. Viz dokumentace.

Dynamická stránka – „Ahoj světe!“ podruhé a to další …

OK, statický obsah je fajn ale po pravdě to není tak úplně každodenní šálek čaje každého z nás. Pojďme si udělat ještě jedno „Ahoj světe!“, o které se postará již nějaká naše třída:

Fajn a teď něco opravdu zajímavého. Jak jsem již uvedl, tak Jet je modulární a ukázali jsme si to v minulém díle. Ale ukažme si to znovu ještě na jednom příkladu.

Situace: Web má nějakou sekci, kam se dostanou pouze registrovaní návštěvníci. Dejme tomu, že je to slouží jako firemní intranet. A někdo z vedení chce mít v tomto interanetu přehled o tom, co kdo dělá v administraci bez toho, aby se sám do administrace musel přihlašovat (prostě se s tím nechce obtěžovat). V administraci už přehled operací ze systému logování máme. Co takhle tento modul prostě nasadit i v intranetu? Není problém:

A co specifické URL?

Fajn, teď jsme si ukazovali vlastně klasické situace. Ale vrátím se k tomu kolegovi, co si lámal hlavu nad tím, jak budou řešit zpracování URL tak, jak si přeje klient. To není žádný problém. Je to také běžná / klasická situace. Pojďme si to opět ukázat prakticky:

Odkazy … a to další

Báze a stránka jsou entity, které mají mnoho dalších využití. Například báze (instance této entity) sebou nese informace o dostupných lokalizacích a řadu dalších věcí. A to samé stránka (opět instance této entity) která nese řadu meta-informací a potřebných pro uspořádání online aplikace a v neposlední řadě také pro tvorbu navigace. Ostatně již jsem ve videu zmínil, že pomocí stránek je možné (no … spíš více jak vhodné) vytvářet odkazy. Ukažme si pár praktických příkladů na dalším videu:

A ne, PHP Jet fakt to není CMS :-) Pouze jsem si uvědomil, že tyto dvě entity (báze a stránka) jsou přirozeným abstraktním základem online aplikací a je to tak od počátku online věků www. Proto Jet řeší celé „routování“ komplexněji, ale ve své podstatě vlastně přirozeně.

A mimochodem … Pomocí továren si samozřejmě můžete udělat svou implementaci stránek a bází. Nic vám v tom nebrání, tento mechanismus je jeden ze základů Jetu. Ale to si ukážeme podrobněji někdy příště.

Závěrem …

V dnešním díle jsem vám chtěl ukázat, že Jet fakt není CMS i když vlastně podobně jako CMS umí některou práci značně usnadnit. Ovšem Jet vám nic zásadního nediktuje, nestojí v cestě a naopak se snaží nabídnout celou řadu možností jak řešit všemožné situace a je jen na vás zvolit ten nejvhodnější nástroj či postup – svět přece nelze narvat do jedné škatulky. Naše úkoly jsou rozmanité, proto je potřeba mít možnost v té rozmanitosti žít jako ryba ve vodě.

Ukázali jsme si, že v Jet je také routování, ale na jednu stranu je primitivnější, protože URL adresy (a tedy stránky) jsou definovány opravdu adresáři podobně jako do kdysi býval PHP skript, ale na druhou stranu je systém daleko komplexnější a mocnější.

A mimochodem … To co jsem dnes ukazoval je hlavní způsob jak v Jet řešit MVC, ale ne jediný. Ukázkový instalátor distribuovaný v základním balíčku je také MVC aplikace, ale vůbec nepoužívá systém bází a stránek. Stejně tak Jet Studio. Ale to už je jiný příběh.

Více se dozvíte v dokumentaci a také tak, že si Jet sami vyzkoušíte, případně v dalších dílech mého blogu.

Díky za přečtení a těším se příště :-)

Sdílet