Metode și atribute de injectare
Folosind exemple specifice, vom examina posibilitățile de transmitere a dependențelor către prezentatori și
vom explica metodele și atributele/notațiile inject
.
inject*()
Metode
În presenter, ca și în orice alt cod, modul preferat de transmitere a dependențelor este prin utilizarea constructorului. Cu toate
acestea, dacă presenterul moștenește de la un strămoș comun (de exemplu, BasePresenter
), este mai bine să se
utilizeze metodele din inject*()
în acel strămoș. Acesta este un caz special de setter, în care metoda începe cu
prefixul inject
. Acest lucru se datorează faptului că păstrăm constructorul liber pentru descendenți:
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;
}
}
Diferența de bază față de un setter este că Nette DI apelează automat metodele denumite astfel în prezentatori imediat
ce este creată instanța, trecându-le toate dependențele necesare. Un prezentator poate conține mai multe metode
inject*()
și fiecare metodă poate avea orice număr de parametri.
Dacă am trece dependențele la strămoși prin intermediul constructorilor acestora, ar trebui să obținem dependențele în
toți descendenții și să le transmitem la parent::__construct()
, ceea ce complică codul:
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); // aceasta este o complicație
$this->bar = $bar;
}
}
Metodele inject*()
sunt, de asemenea, utile în cazurile în care prezentatorul este compus din trăsături și fiecare dintre ele necesită
propria dependență.
De asemenea, este posibil să se utilizeze adnotarea @inject
, dar este important să se țină cont de faptul că
încapsularea se întrerupe.
Inject
Adnotări
Aceasta este o trecere automată a dependenței către variabila membră publică a prezentatorului, care este adnotată cu
@inject
în comentariul din documentație. Tipul poate fi, de asemenea, specificat în comentariul documentației
dacă utilizați un PHP mai mic de 7.4.
class MyPresenter extends Nette\Application\UI\Presenter
{
/** @inject */
public Cache $cache;
}
Începând cu PHP 8.0, o proprietate poate fi marcată cu un atribut Inject
:
use Nette\DI\Attributes\Inject;
class MyPresenter extends Nette\Application\UI\Presenter
{
#[Inject]
public Cache $cache;
}
Din nou, Nette DI va trece în mod automat dependențele proprietăților notate în acest mod în prezentator imediat ce este creată instanța.
Această metodă are aceleași neajunsuri ca și trecerea dependențelor la o proprietate publică. Ea este utilizată în presenter deoarece nu complică codul și necesită doar un minim de tastare.