Továrny

Aby byl Jet opravdu flexibilní, nápomocný a ne překážející, tak musí být možné upravit si vše tak jak potřebujete. Není prostě možné o něčem říct: je to tak a tak, tak to musí být a nedá se s tím nic dělat. Tento problém je v Jet řešen dvěma způsoby.

První často používaný způsob je vkládání závislostí. Mnoho částí Jet funguje tak, že má fasádu - kontejner, který slouží jako unifikované rozhraní a do něj se vkládá backend, který již provádí samotnou činnost. Tak je řešená keš, překladač, autoloader, dokonce správa aplikačních modulů a řada dalších věcí. Ovšem takto nelze řešit vše.

Druhá možnost se používá tam, kde Jet sám potřebuje vytvářet instance nějakých tříd. Vezměme si jako příklad Jet MVC. Jet potřebuje vytvářet instance bází, stránek, ale i view a layoutu. Nebo systém aplikačních modulů. Ten potřebuje vytvářet instance manifestů modulů. A tak dále.

A pro tyto situace je nutné nějak zabezpečit, aby Jet nevytvářel instance přímo nějaké konkrétní třídy. Například aby když potřebuje instanci stránky nevytvářel nikdy přímo instanci třídy Jet\MVC_Page, protože tato třída musí být zaměnitelná za úplně jinou třídu. Zaměnitelná například za vaší třídu, která doplní do systému vlastnosti, které ve svém základu nemá. Tedy třídou pro stránku nemusí být nutně Jet\MVC_Page, ale třeba JetApplication\MyMVC_Page. Ovšem samozřejmě s tím, že vaše třída JetApplication\MyMVC_Page musí vždy splňovat podmínky, zpravidla implementovat nějaké rozhraní, například v tomto případě Jet\MVC_Page_Interface.

A celou tuto situaci řeší továrny. Účelem továren v Jet je:

  • Na požádání vytvářet instance tříd, které plní určitou roli (a mají tedy určité rozhraní).
  • Nést informace o názvech tříd, které budou pro daný účel použity.
  • Umožnit měnit a nastavit názvy použitých tříd.

Továrny v praxi

Pojďme si to ukázat v praxi na příkladu. Chcete použít view. První co člověka napadne je udělat toto:

use Jet\MVC_View;
$view = new MVC_View('/somer/dir/');

Jenže pak se ukáže, že v projektu potřebujete vlastní view, které umí něco, co Jet\MVC_View neumí. Co s tím? Budete všude ve zdrojácích a to včetně knihovny Jet měnit název třídy? Nebo budete používat různá kouzla? Ne. Nejlepší je konzistentně používat továrny. Tedy view si vytvořit takto:

use Jet\Factory_MVC;
$view Factory_MVC::getViewInstance('/some/dir/');

Ano, je to pár písmenek navíc, ale to snad nikoho nezabije :-)

A až budete potřebovat vlastní implementaci view (i když z hlediska základního rozhraní kompatibilní s tou starou), tak v inicializaci vaší aplikace uděláte toto:

use Jet\Factory_MVC;
Factory_MVC::setViewClassNameMyView::class );

Ihned součást systému tvoří vámi vylepšená implementace view. Je k dispozici všude, v modulech, kontrolerech a tak dále. Jednoduše, transparentně a bez kouzel.

Poznámka: Pokud si pečlivě prohlédnete zdrojové kódy instalátoru, tak zjistíte, že tam se view "vesele" používá bez továrny. To není chyba, ale záměr. Má to svou logiku. Věci jako instalátor, nebo Jet Studio, jsou do velké míry nezávislé aplikace, separované od samotné výsledné aplikace, která má být na Jet vyvinuta - tedy stojí to mimo váš projekt. Proto například pro instalátor a Jet Studio potřebuje tu implementaci View, kterou zná - to jest tu z Jet. Ovšem v rámci aplikace a aplikačního prostoru samotného je používání továren více jak vhodné. Nenechte se zmást s tím, že přibalené nástroje tento koncept nedodržují.

Seznam továren

Jet\Factory_Application Továrna zaměřená na práci s aplikačními moduly.
Jet\Factory_DataModel Továrna určena pro ORM DataModel.
Jet\Factory_Db Továrna pro práci s backendem připojení k databázi.
Jet\Factory_Form Továrna určená pro subsystém formulářů.
Jet\Factory_MVC Továrna pro Jet MVC.
Jet\Factory_PackageCreator Továrna pro balíčkovače CSS a JS.
Jet\Factory_Translator Továrna určená pro překladač.
Jet\Factory_Config Továrna konfiguračního systému.
Předchozí kapitola
Dependency Injection v Jet
Další kapitola
Jet\Factory_Application