Metody a atributy inject
Na konkrétních případech si přiblížíme možnosti předávání závislostí do presenterů a vysvětlíme
si metody a atributy/anotace inject
.
Metody inject*()
V presenterech, stejně jako v každém jiném kódu, je preferovaný způsob předávání závislostí pomocí konstruktoru. Pokud však presenter dědí od
společného předka (např. BasePresenter
), je lepší v tomto předkovi použít metody inject*()
.
Jedná se o zvláštní případ setteru, kdy metoda začíná prefixem inject
. Jeho použitím si totiž ponecháme
konstruktor volný pro potomky:
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
private Foo $foo;
public function injectBase(Foo $foo): void
{
$this->foo = $foo;
}
}
class MyPresenter extends BasePresenter
{
private Bar $bar;
public function __construct(Bar $bar)
{
$this->bar = $bar;
}
}
Základní rozdíl od setteru je ten, že Nette DI takto pojmenované metody v presenterech automaticky volá hned po
vytvoření instance a předá jim všechny požadované závislosti. Metod inject*()
může presenter obsahovat
více a každá může mít libovolný počet parametrů.
Pokud bychom závislosti předávali předkům skrze jejich konstruktory, museli bychom ve všech potomcích získávat
i jejich závislosti a předávat je do parent::__construct()
, což komplikuje kód:
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
private Foo $foo;
public function __construct(Foo $foo)
{
$this->foo = $foo;
}
}
class MyPresenter extends BasePresenter
{
private Bar $bar;
public function __construct(Foo $foo, Bar $bar)
{
parent::__construct($foo); // tohle je komplikace
$this->bar = $bar;
}
}
Metody inject*()
se hodí také v případech, kdy je presenter složen
z trait a každá z nich si vyžádá vlastní závislost.
Je také možné použít anotaci @inject
, je však třeba mít na paměti, že dojde k porušení
zapouzdření.
Anotace inject
Jedná se o automatické předávání závislosti do veřejné členské proměnné presenteru, která je označená anotací
@inject
v dokumentačním komentáři. Typ závislosti je možné uvést také v dokumentačním komentáři, pokud
používáte PHP nižší než 7.4.
class MyPresenter extends Nette\Application\UI\Presenter
{
/** @inject */
public Cache $cache;
}
Od PHP 8.0 lze proměnnou označit pomocí atributu Inject
:
use Nette\DI\Attributes\Inject;
class MyPresenter extends Nette\Application\UI\Presenter
{
#[Inject]
public Cache $cache;
}
Nette DI opět takto anotovaným proměnným v presenteru automaticky předá závislosti hned po vytvoření instance.
Tento způsob má stejné nedostatky, jako předávání závislosti do veřejné proměnné. V presenterech se používá proto, že nekomplikuje kód a vyžaduje jen minimum psaní.