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.
Nic z toho se vám snadno nepodaří. Čeká vás procházení celého projektu, úprava spousty míst kódu (klidně stovek) a s tím samozřejmě spojené riziko chyb a problémů. Pro větší projekt noční můra.

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.
Předchozí kapitola
Atributy - Jet\Attributes
Další kapitola
Garant služeb