Nette Documentation Preview

syntax
Méthodes et attributs d'injection
*********************************

.[perex]
Dans cet article, nous allons nous concentrer sur les différentes façons de transmettre des dépendances aux présentateurs dans le cadre de Nette. Nous comparerons la méthode préférée, qui est le constructeur, avec d'autres options telles que les méthodes et les attributs `inject`.

Pour les présentateurs également, la transmission des dépendances à l'aide du [constructeur |dependency-injection:passing-dependencies#Constructor Injection] est la méthode préférée.
Cependant, si vous créez un ancêtre commun dont les autres présentateurs héritent (par exemple, BasePresenter) et que cet ancêtre possède également des dépendances, un problème se pose, que nous appelons l'[enfer du constructeur |dependency-injection:passing-dependencies#Constructor hell].
Ce problème peut être contourné en utilisant des méthodes alternatives, qui incluent l'injection de méthodes et d'attributs (annotations).


`inject*()` Méthodes .[#toc-inject-methods]
===========================================

Il s'agit d'une forme de transfert de dépendance à l'aide de [fixateurs |dependency-injection:passing-dependencies#Setter Injection]. Les noms de ces setters commencent par le préfixe inject.
Nette DI appelle automatiquement ces méthodes nommées immédiatement après la création de l'instance du présentateur et leur transmet toutes les dépendances nécessaires. Elles doivent donc être déclarées comme publiques.

`inject*()` Les méthodes publiques peuvent être considérées comme une sorte d'extension de constructeur en plusieurs méthodes. Grâce à cela, `BasePresenter` peut prendre des dépendances par le biais d'une autre méthode et laisser le constructeur libre pour ses descendants :

```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;
	}
}
```

Le présentateur peut contenir n'importe quel nombre de méthodes `inject*()`, et chacune peut avoir n'importe quel nombre de paramètres. C'est également très utile lorsque le présentateur est [composé de traits |presenter-traits] et que chacun d'entre eux nécessite sa propre dépendance.


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

Il s'agit d'une forme d'[injection dans les propriétés |dependency-injection:passing-dependencies#Property Injection]. Il suffit d'indiquer quelles propriétés doivent être injectées, et Nette DI passe automatiquement les dépendances immédiatement après la création de l'instance du présentateur. Pour les insérer, il est nécessaire de les déclarer comme publiques.

Les propriétés sont marquées par un attribut : (auparavant, l'annotation `/** @inject */` était utilisée)

```php
use Nette\DI\Attributes\Inject ; // cette ligne est importante

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

L'avantage de cette méthode de transmission des dépendances était sa forme de notation très économique. Cependant, avec l'introduction de la [promotion des propriétés du constructeur |https://blog.nette.org/fr/php-8-0-apercu-complet-des-nouveautes#toc-constructor-property-promotion], l'utilisation du constructeur semble plus facile.

D'autre part, cette méthode souffre des mêmes défauts que le passage des dépendances dans les propriétés en général : nous n'avons aucun contrôle sur les changements de la variable, et en même temps, la variable devient une partie de l'interface publique de la classe, ce qui n'est pas souhaitable.


{{sitename: Meilleures pratiques}}

Méthodes et attributs d'injection

Dans cet article, nous allons nous concentrer sur les différentes façons de transmettre des dépendances aux présentateurs dans le cadre de Nette. Nous comparerons la méthode préférée, qui est le constructeur, avec d'autres options telles que les méthodes et les attributs inject.

Pour les présentateurs également, la transmission des dépendances à l'aide du constructeur est la méthode préférée. Cependant, si vous créez un ancêtre commun dont les autres présentateurs héritent (par exemple, BasePresenter) et que cet ancêtre possède également des dépendances, un problème se pose, que nous appelons l'enfer du constructeur. Ce problème peut être contourné en utilisant des méthodes alternatives, qui incluent l'injection de méthodes et d'attributs (annotations).

inject*() Méthodes

Il s'agit d'une forme de transfert de dépendance à l'aide de fixateurs. Les noms de ces setters commencent par le préfixe inject. Nette DI appelle automatiquement ces méthodes nommées immédiatement après la création de l'instance du présentateur et leur transmet toutes les dépendances nécessaires. Elles doivent donc être déclarées comme publiques.

inject*() Les méthodes publiques peuvent être considérées comme une sorte d'extension de constructeur en plusieurs méthodes. Grâce à cela, BasePresenter peut prendre des dépendances par le biais d'une autre méthode et laisser le constructeur libre pour ses descendants :

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;
	}
}

Le présentateur peut contenir n'importe quel nombre de méthodes inject*(), et chacune peut avoir n'importe quel nombre de paramètres. C'est également très utile lorsque le présentateur est composé de traits et que chacun d'entre eux nécessite sa propre dépendance.

Inject Attributs

Il s'agit d'une forme d'injection dans les propriétés. Il suffit d'indiquer quelles propriétés doivent être injectées, et Nette DI passe automatiquement les dépendances immédiatement après la création de l'instance du présentateur. Pour les insérer, il est nécessaire de les déclarer comme publiques.

Les propriétés sont marquées par un attribut : (auparavant, l'annotation /** @inject */ était utilisée)

use Nette\DI\Attributes\Inject ; // cette ligne est importante

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

L'avantage de cette méthode de transmission des dépendances était sa forme de notation très économique. Cependant, avec l'introduction de la promotion des propriétés du constructeur, l'utilisation du constructeur semble plus facile.

D'autre part, cette méthode souffre des mêmes défauts que le passage des dépendances dans les propriétés en général : nous n'avons aucun contrôle sur les changements de la variable, et en même temps, la variable devient une partie de l'interface publique de la classe, ce qui n'est pas souhaitable.