Metode in atributi injiciranja
V tem članku se bomo osredotočili na različne načine posredovanja odvisnosti predstavnikom v ogrodju Nette.
Primerjali bomo prednostni način, to je konstruktor, z drugimi možnostmi, kot so metode in atributi inject
.
Tudi za predstavnike je prednostni način posredovanja odvisnosti z uporabo konstruktorja. Če pa ustvarite skupnega prednika, od katerega dedujejo drugi predstavniki (npr. BasePresenter), in ima ta prednik tudi odvisnosti, nastane težava, ki jo imenujemo konstruktorski pekel. To lahko obidemo z uporabo alternativnih metod, ki vključujejo metode inject in atribute (anotacije).
inject*()
Metode
To je oblika posredovanja odvisnosti z uporabo nastavljalcev. Imena teh nastavljalcev se začnejo s predpono inject. Nette DI samodejno pokliče tako poimenovane metode takoj po ustvarjanju primerka predstavnika in jim posreduje vse zahtevane odvisnosti. Zato morajo biti deklarirane kot javne.
inject*()
metode lahko obravnavamo kot nekakšno razširitev konstruktorja na več metod. Zahvaljujoč temu lahko
BasePresenter
prevzame odvisnosti prek druge metode, konstruktor pa ostane prost za svoje potomce:
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;
}
}
Predstavitelj lahko vsebuje poljubno število metod inject*()
, vsaka pa ima lahko poljubno število parametrov. To
je odlično tudi v primerih, ko je predstavnik sestavljen iz
lastnosti in vsaka od njih zahteva svojo odvisnost.
Inject
Atributi
To je oblika vbrizgavanja v lastnosti. Dovolj je, da navedete, katere lastnosti naj se injicirajo, in Nette DI samodejno prenese odvisnosti takoj po ustvarjanju primerka predstavnika. Če jih želite vstaviti, jih je treba deklarirati kot javne.
Lastnosti so označene z atributom: (prej se je uporabljala anotacija /** @inject */
)
use Nette\DI\Attributes\Inject; // ta vrstica je pomembna
class MyPresenter extends Nette\Application\UI\Presenter
{
#[Inject]
public Cache $cache;
}
Prednost tega načina posredovanja odvisnosti je bila zelo ekonomična oblika zapisa. Z uvedbo napredovanja lastnosti konstruktorja pa se zdi uporaba konstruktorja lažja.
Po drugi strani pa ima ta metoda enake pomanjkljivosti kot posredovanje odvisnosti v lastnosti na splošno: nimamo nadzora nad spremembami spremenljivke, hkrati pa spremenljivka postane del javnega vmesnika razreda, kar ni zaželeno.