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 – 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:
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.
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:
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.
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:
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:
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ě.
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ě :-)
Nepřílš přesvědčivě - většinou ve stylu "k tomu se dostanu v některém z dalších dílů".
Působí to na mě, že autor současné frameworky nezná a neví, co všechno umí. Pokud vím, jediné zmínky o nich byly v prvním díle "kdysi jsem zkoušel Zend Framework 1 a nelíbil se mi" (což naprosto chápu btw, to byla obludnost) a v tomto díle "známý mi říkal, že ve frameworku, co používá, nejde jednoduše nastavit hezké URL" (což zní podivně).
Současné framworky znám velice dobře a neustále zkoumám co je kde nového, konfrontuji, zkouším co a jak atd.
Kdyby bylo něco v čem dokážu pracovat rychleji než v Jetu, použiji to. Ale nic takového jsem nenašel. Celkový důvod je jednoduchý: Jet je udělaný tak, aby práce v něm byla celkově mnohem efektivnější a to s důrazem na velké komplexní projekty.
K přímému porovnání se dostanu také, nebojte. Ale trpělivost prosím :-)
Dík za dotaz.
Zatím představuji co Jet dělá. Plánuji v dohledné době udělat srovnávací článek kde přímo ukážu modelové situace Jet vs Laravel (ten beru jako momentálně nejrelevantnější).
Ale již minulém díle jsem vytvořil malou ukázkovou aplikaci (respektive komponentu aplikace / projektu). Lze snadno dohledat ukázky něčeho podobného v jiném frameworku.
Autor napsal vlastní framework tj. řešení pro své problémy v dané doméně. Je k dispozici ostatním. Takhle vznikal každý framework jako Laravela atd. Já nejsem cílovka, ale přeji autorovi síly a klidně si přečtu další blogový příspěvek. Zdar!
Konečně jsem se dostal k tomu, abych vyzkoušel aspoň úvodní instalátor. Pár postřehů:
- Neměl jsem zapnutý PHP modul intl. Instalátor sice v pozdějším kroku vypisuje, které PHP moduly potřebuje a jestli jsou zapnuté, nicméně bez intl se do tohoto kroku ani nedostane (nevím, jak jsou na tom ostatní moduly, ty jsem měl).
- Pokud má člověk zapnutý error level E_ALL (včetně E_NOTICE), je prvních pár stránek prohlížeče vytapetováno hláškami jako "Return type of Jet\Http_Request_Trap::next(): mixed should either be compatible with Iterator::next(): void" nebo "Implicit conversion from float 1.001 to int loses precision". Až po několikanásobném PageDown se zobrazí obsah stránky. Na jednom z kroků instalátoru to i způsobilo nefunkční redirect (protože "headers already sent").
Víc jsem toho zatím projít nestihl. Tyhle chybky ale trochu kazí první dojem a jak jistě víte, ten je hodně důležitý.
Opraveno ... Kam mám poslat flašku (či něco jiného)? ;-)
Jet si sám zapíná error reporting na E_ALL - samozřejmě.
Ale tohle byla záležitost PHP8.1 a musím si prostě posypat hlavu popelem a přiznat se, že vše bylo testováno na PHP8.0 a pro jinou práci (co se týká Jet tak hlavně revize a psaní dokumentace) jsem se k 8.1 nedostal. Ne výmluva - má blbost a hodně užitečné ponaučení.
A že intl jsem bral jako standard již několik let, ale to je můj "mikrokosmos" a díky za vytažení z tohoto mikrokosmu :-)
Přesně to potřebuji - dostat to mimo můj "mikrokosmos"
Ad CMS/CMF - to jsem původně myslel tak, že dneska existuje spousta nástrojů, jak rychle a bezbolestně dosáhnout cíle, ať je to, co je to. Zajímavá jsou kombinovaná řešení, kde existují silné nástroje na standardizovaný problém (CMS/CMF), které ale můžete k uspokojení dílčího řešení obejít a použít základní framework, který též můžete v případě potřeby obejít a použít čisté PHP.
Pro vývojáře je pak nejdůležitější, jak kvalitní a srozumitelné poskytuje systém nástroje/ekosystém ke splnění zakázky.
... a Jet je to vše na jednom místě. A zároveň je to ve své podstatě velice malé a jednoduché a je v tom jednotný řád a systém.
Více v dalších dílech ;-)
Slušná práce, gratuluji a děkuji za zveřejnění.
Je to inspirující, motivující a zaslouží to pochvalu. Bohužel celkově je to další " One man show " framework, který není komponentární - odmítání composeru je jako odmítání vlivu člověka na ekosystém naší planety.
Docker distribuce není.
Nevím co si myslet o tom pseudo CMS, lze to jednoduše odstranit?
Přečteno 15 385×
Přečteno 12 849×
Přečteno 12 846×
Přečteno 12 397×
Přečteno 11 723×