PSR-11: Standard pro DI kontejner

PHP

POZOR! Článek jsem napsal před více jak rokem, a tudíž už nemusí reflektovat můj nynější názor nebo může být zastaralý.

Je to pár dní, co byl oficiálně akceptován návrh dalšího ze standardů skupiny PHP-FIG a to interface pro DI (dependecy injection) kontejner. Oficiální znění naleznete na GitHubu a já jsem se rozhodl, že jej zde trochu popíšu, a že se ho budu v komponentě gephart/dependency-injection držet.

Co standard říká?

  1. Identifikátor, podle kterého je položka (objekt) vytahován z kontejneru, musí být řetězec o délce alespoň jednoho znaku. Neměl by mít žádný sémantický význam.
  2. Kontejner musí mít dvě veřejné metody:
    1. get() – má jeden povinný parametr a to identifikátor položky
      – pokud identifikátoru neodpovídá žádná z položek, musí být vyhozena výjimka implementující Psr\Container\NotFoundExceptionInterface (taktéž součástí standardu)
    2. has() – má opět jeden povinný parametr – identifikátor položky
      – vrátí false v případě, kdy by metoda get() vyhodila zmíněnou výjimku
  3. Výjimky vyhozené kontejnerem by měli vyhazovat výjimku implementující Psr\Container\ContainerExceptionInterface.
  4. Doporučuje nepoužívat kontejner jako service locator (doporučuji článek od Davida Grudla). Ve zkratce to znamená, že obecné doporučení je nemít závislost na samotném kontejneru, jen na jednotlivých službách. (Pozor na to, že třeba třída Router, která je běžně závislá na DI kontejneru a vytahuje z něj controller, tak opravdu není závislá na samotném controlleru, a proto to zde nevadí.)

Pokud jste se rozhodli, že se budete držet standardu, je doporučené implementovat interface (kontejneru a výjimek) z toho balíčku: psr/container-implementation.

Znáte někoho, komu by článek mohl pomoct? Zasdílejte mu ho :)

Komentáře