-
-
Notifications
You must be signed in to change notification settings - Fork 282
/
inject-method-attribute.texy
67 lines (46 loc) · 3.62 KB
/
inject-method-attribute.texy
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Injektionsmethoden und -attribute
*********************************
.[perex]
In diesem Artikel werden wir uns auf verschiedene Möglichkeiten konzentrieren, Abhängigkeiten an Presenter im Nette-Framework zu übergeben. Wir werden die bevorzugte Methode, nämlich den Konstruktor, mit anderen Optionen wie `inject` Methoden und Attributen vergleichen.
Auch für Presenter ist die Übergabe von Abhängigkeiten über den [Konstruktor |dependency-injection:passing-dependencies#Constructor Injection] die bevorzugte Methode.
Wenn Sie jedoch einen gemeinsamen Vorfahren erstellen, von dem andere Präsentatoren erben (z. B. BasePresenter), und dieser Vorfahre ebenfalls Abhängigkeiten hat, tritt ein Problem auf, das wir [Konstruktorhölle |dependency-injection:passing-dependencies#Constructor hell] nennen.
Dieses Problem kann durch alternative Methoden umgangen werden, die Methoden und Attribute (Annotationen) einschließen.
`inject*()` Methoden .[#toc-inject-methods]
===========================================
Dies ist eine Form der Übergabe von Abhängigkeiten unter Verwendung von [Settern |dependency-injection:passing-dependencies#Setter Injection]. Die Namen dieser Setzer beginnen mit dem Präfix inject.
Nette DI ruft solche benannten Methoden unmittelbar nach dem Erzeugen der Presenter-Instanz automatisch auf und übergibt ihnen alle erforderlichen Abhängigkeiten. Sie müssen daher als public deklariert werden.
`inject*()` Methoden können als eine Art Konstruktorerweiterung in mehrere Methoden betrachtet werden. Dadurch kann `BasePresenter` Abhängigkeiten durch eine andere Methode aufnehmen und den Konstruktor für seine Nachkommen frei lassen:
```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;
}
}
```
Der Präsentator kann eine beliebige Anzahl von `inject*()` Methoden enthalten, und jede kann eine beliebige Anzahl von Parametern haben. Dies eignet sich auch hervorragend für Fälle, in denen der Presenter [aus Traits |presenter-traits] besteht, von denen jeder seine eigene Abhängigkeit erfordert.
`Inject` Attribute .[#toc-inject-attributes]
============================================
Dies ist eine Form der [Injektion in Eigenschaften |dependency-injection:passing-dependencies#Property Injection]. Es genügt, anzugeben, welche Eigenschaften injiziert werden sollen, und Nette DI übergibt die Abhängigkeiten automatisch sofort nach der Erstellung der Presenter-Instanz. Um sie einzufügen, ist es notwendig, sie als öffentlich zu deklarieren.
Eigenschaften werden mit einem Attribut gekennzeichnet: (früher wurde die Annotation `/** @inject */` verwendet)
```php
use Nette\DI\Attributes\Inject; // diese Zeile ist wichtig
class MyPresenter extends Nette\Application\UI\Presenter
{
#[Inject]
public Cache $cache;
}
```
Der Vorteil dieser Methode der Übergabe von Abhängigkeiten war die sehr sparsame Notation. Mit der Einführung der [Förderung von Konstruktoreigenschaften |https://blog.nette.org/de/php-8-0-vollstaendiger-ueberblick-ueber-die-neuigkeiten#toc-constructor-property-promotion] scheint die Verwendung des Konstruktors jedoch einfacher zu sein.
Andererseits leidet diese Methode unter denselben Mängeln wie die Übergabe von Abhängigkeiten in Eigenschaften im Allgemeinen: Wir haben keine Kontrolle über Änderungen an der Variablen, und gleichzeitig wird die Variable Teil der öffentlichen Schnittstelle der Klasse, was unerwünscht ist.
{{sitename: Bewährte Praktiken}}