Metode și atribute de injectare

În acest articol, ne vom concentra asupra diferitelor modalități de transmitere a dependențelor către prezentatori în cadrul Nette. Vom compara metoda preferată, care este constructorul, cu alte opțiuni, cum ar fi metodele și atributele inject.

Și pentru prezentatori, transmiterea dependențelor folosind constructorul este metoda preferată. Cu toate acestea, dacă creați un strămoș comun din care moștenesc alți prezentatori (de exemplu, BasePresenter), iar acest strămoș are, de asemenea, dependențe, apare o problemă, pe care o numim constructor hell. Aceasta poate fi ocolită folosind metode alternative, care includ metode și atribute de injectare (adnotări).

inject*() Metode

Aceasta este o formă de transmitere a dependențelor prin intermediul setorilor. Numele acestor setteri încep cu prefixul inject. Nette DI apelează automat astfel de metode numite imediat după crearea instanței de prezentator și le transmite toate dependențele necesare. Prin urmare, acestea trebuie să fie declarate ca fiind publice.

inject*() metodele pot fi considerate ca un fel de extindere a constructorului în mai multe metode. Datorită acestui fapt, BasePresenter poate prelua dependențele printr-o altă metodă și poate lăsa constructorul liber pentru descendenții să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;
	}
}

Prezentatorul poate conține un număr nelimitat de metode inject*(), iar fiecare poate avea un număr nelimitat de parametri. Acest lucru este, de asemenea, excelent pentru cazurile în care prezentatorul este compus din trăsături, iar fiecare dintre acestea necesită propria dependență.

Inject Atribute

Aceasta este o formă de injecție în proprietăți. Este suficient să indicați ce proprietăți trebuie injectate, iar Nette DI trece automat dependențele imediat după crearea instanței de prezentator. Pentru a le insera, este necesar să le declarați ca fiind publice.

Proprietățile sunt marcate cu un atribut: (anterior, se folosea adnotarea /** @inject */)

use Nette\DI\Attributes\Inject; // această linie este importantă

class MyPresenter extends Nette\Application\UI\Presenter
{
	#[Inject]
	public Cache $cache;
}

Avantajul acestei metode de transmitere a dependențelor a fost forma foarte economică de notare. Cu toate acestea, odată cu introducerea promovării proprietăților constructorului, utilizarea constructorului pare mai ușoară.

Pe de altă parte, această metodă suferă de aceleași neajunsuri ca și trecerea dependențelor în proprietăți în general: nu avem niciun control asupra modificărilor variabilei și, în același timp, variabila devine parte a interfeței publice a clasei, ceea ce nu este de dorit.