Nette Documentation Preview

syntax
Metode in atributi injiciranja
******************************

.[perex]
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 |dependency-injection:passing-dependencies#Constructor Injection].
Č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 |dependency-injection:passing-dependencies#Constructor hell].
To lahko obidemo z uporabo alternativnih metod, ki vključujejo metode inject in atribute (anotacije).


`inject*()` Metode .[#toc-inject-methods]
=========================================

To je oblika posredovanja odvisnosti z uporabo [nastavljalcev |dependency-injection:passing-dependencies#Setter Injection]. 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:

```php
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 |presenter-traits] in vsaka od njih zahteva svojo odvisnost.


`Inject` Atributi .[#toc-inject-attributes]
===========================================

To je oblika [vbrizgavanja v lastnosti |dependency-injection:passing-dependencies#Property Injection]. 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 */`)

```php
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 |https://blog.nette.org/sl/php-8-0-popoln-pregled-novic#toc-constructor-property-promotion] 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.


{{sitename: Best Practices}}

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.