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.