Injektionsmethoden und -attribute

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 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 nennen. Dieses Problem kann durch alternative Methoden umgangen werden, die Methoden und Attribute (Annotationen) einschließen.

inject*() Methoden

Dies ist eine Form der Übergabe von Abhängigkeiten unter Verwendung von Settern. 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:

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 besteht, von denen jeder seine eigene Abhängigkeit erfordert.

Inject Attribute

Dies ist eine Form der Injektion in Eigenschaften. 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)

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 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.