Μέθοδοι και χαρακτηριστικά Inject

Σε αυτό το άρθρο, θα επικεντρωθούμε σε διάφορους τρόπους μετάδοσης εξαρτήσεων σε παρουσιαστές στο πλαίσιο Nette. Θα συγκρίνουμε την προτιμώμενη μέθοδο, που είναι ο κατασκευαστής, με άλλες επιλογές, όπως οι μέθοδοι inject και τα χαρακτηριστικά.

Και για τους παρουσιαστές, το πέρασμα εξαρτήσεων με τη χρήση του κατασκευαστή είναι ο προτιμώμενος τρόπος. Ωστόσο, αν δημιουργήσετε έναν κοινό πρόγονο από τον οποίο κληρονομούν άλλοι παρουσιαστές (π.χ. BasePresenter) και αυτός ο πρόγονος έχει επίσης εξαρτήσεις, προκύπτει ένα πρόβλημα, το οποίο ονομάζουμε κόλαση του κατασκευαστή. Αυτό μπορεί να παρακαμφθεί με τη χρήση εναλλακτικών μεθόδων, οι οποίες περιλαμβάνουν μεθόδους inject και χαρακτηριστικά (annotations).

inject*() Μέθοδοι

Πρόκειται για μια μορφή μεταβίβασης εξαρτήσεων με χρήση ρυθμιστών. Τα ονόματα αυτών των ρυθμιστών αρχίζουν με το πρόθεμα inject. Η Nette DI καλεί αυτόματα τέτοιες ονομαστικές μεθόδους αμέσως μετά τη δημιουργία της περίπτωσης παρουσιαστή και τους μεταβιβάζει όλες τις απαιτούμενες εξαρτήσεις. Επομένως, πρέπει να δηλωθούν ως δημόσιες.

inject*() μέθοδοι μπορούν να θεωρηθούν ως ένα είδος επέκτασης του κατασκευαστή σε πολλαπλές μεθόδους. Χάρη σε αυτό, το BasePresenter μπορεί να λάβει εξαρτήσεις μέσω μιας άλλης μεθόδου και να αφήσει τον κατασκευαστή ελεύθερο για τους απογόνους του:

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

Ο παρουσιαστής μπορεί να περιέχει οποιονδήποτε αριθμό μεθόδων inject*() και κάθε μία από αυτές μπορεί να έχει οποιονδήποτε αριθμό παραμέτρων. Αυτό είναι επίσης εξαιρετικό για περιπτώσεις όπου ο παρουσιαστής αποτελείται από γνωρίσματα και κάθε ένα από αυτά απαιτεί τη δική του εξάρτηση.

Inject Χαρακτηριστικά

Αυτή είναι μια μορφή έγχυσης σε ιδιότητες. Αρκεί να υποδείξετε ποιες ιδιότητες πρέπει να εγχυθούν, και το Nette DI περνάει αυτόματα τις εξαρτήσεις αμέσως μετά τη δημιουργία της παρουσιαζόμενης περίπτωσης. Για την εισαγωγή τους, είναι απαραίτητο να δηλωθούν ως δημόσιες.

Οι ιδιότητες επισημαίνονται με μια ιδιότητα: (προηγουμένως, χρησιμοποιούνταν ο σχολιασμός /** @inject */)

use Nette\DI\Attributes\Inject; // αυτή η γραμμή είναι σημαντική

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

Το πλεονέκτημα αυτής της μεθόδου μετάδοσης εξαρτήσεων ήταν η πολύ οικονομική μορφή συμβολισμού της. Ωστόσο, με την εισαγωγή της προώθησης των ιδιοτήτων του κατασκευαστή, η χρήση του κατασκευαστή φαίνεται ευκολότερη.

Από την άλλη πλευρά, η μέθοδος αυτή πάσχει από τις ίδιες αδυναμίες με τη μεταβίβαση εξαρτήσεων σε ιδιότητες γενικά: δεν έχουμε κανέναν έλεγχο των αλλαγών στη μεταβλητή και ταυτόχρονα, η μεταβλητή γίνεται μέρος της δημόσιας διεπαφής της κλάσης, πράγμα ανεπιθύμητο.