Dependency Injection v Jet
K čemu je DI vlastně dobré?
Pokud to víte, tak můžete tuto kapitolu přeskočit ;-)
Hlavní výhodou DI je, že uživatelské třídy zcela izoluje od vytváření a inicializace jejich služeb. To je hlavní a nejdůležitější přínost. Ale bude lepší si to vysvětlit na konkrétním případě.
Dejme tomu, že máme v systému logování. Logování musí zabezpečit nějaká třída. A logování je služba, která tato třída poskytuje - třída je poskytovatelem služby.
Dále máme uživatele služby. Tedy v našem případě cokoliv co potřebuje logovat do nějakého logu. Buďme opět konkrétní a řekněme že to může být například nějaký kontroler (ale může to samozřejmě být cokoliv jiného). Ve špatně navržené aplikace, která zcela ignoruje DI, by onen kontroler logoval například takto:
class Controller extends Controller_Abstract {
public function someAction() : void
{
//... ... ...
$logger = new Logger('~/path/to/some/log/dir');
$logger->logEvent( $event, $event_data );
//... ... ...
}
}
To je naprosto špatně a takto se programovat nemá. Proč? Z čistě objektivních důvodů: Představte si, že takto vytváříte instanci služby třeba na stovkách míst. A pak přijde den, kdy budete potřebovat logování změnit:
- Třeba vyměnit onu třídu za úplně jinou
- Nebo třídu přenastavit, změnit parametry služby
- Nebo nechat nějakou vyšší autoritu aby rozhodovala o tom jak bude aplikace logovat.
Nehledě na prostý fakt, že kontroler v našem příkladu dělá prostě to co nemá. Stará se o inicializaci služby a to není jeho kompetence a zodpovědnost. To je opět prohřešek proti pravidlům pro vytváření udržitelných projektů.
Ale řekl bych, že hlavním strašákem je ta představa že třeba za dva roky provozu projektu musíte procházet a upravovat stovky míst v projektu to třeba i jen kvůli malé dílčí změně. To je čitě objektivní velký problém a tomu se chceme vyhnout.
A právě to je hlavní benefit mechanismů DI. Při jeho dodržování je zabezpečeno že inicializace služby se nebude starat uživatel služby.
DI je tedy věc nutná.
DI mechanismy v PHP Jet
Existuje celá řada mechanismů jak DI realizovat. Každý mechanismus je vhodný v jiné situaci. PHP Jet nabízí tři následující mechanismy, které jsou v něm implementovány a využity v ukázkové aplikaci.
- Garanty služeb
Garant služeb je základní přístup jak se v PHP Jet operuje se systémovými službami jako je již zmíněné logování, autentizace a autorizace a řada dalších (viz příslušná kapitola). Cílem je učinit použití systémových služeb maximálně jednoduché a zároveň využít výhod principů DI. - Aplikační služby
Jednoduchý, ale velice efektivní systém pro vytváření a použití služeb na úrovni aplikace případně i s využitím aplikačních modulů. - Továrny
Princip továren slouží v PHP Jet k instancování systémových tříd a především k jejich možné výměně a rozšíření za třídy vytvořené vývojářem.