Δοχείο Nette DI

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

Οι υπηρεσίες που θα δημιουργηθούν από ένα DI container ορίζονται συνήθως με τη χρήση αρχείων διαμόρφωσης σε μορφή NEON. Ο περιέκτης που δημιουργήσαμε χειροκίνητα στην προηγούμενη ενότητα θα γραφόταν ως εξής:

parameters:
	db:
		dsn: 'mysql:'
		user: root
		password: '***'

services:
	- Nette\Database\Connection(%db.dsn%, %db.user%, %db.password%)
	- ArticleFactory
	- UserController

Ο συμβολισμός είναι πραγματικά σύντομος.

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

Αν θέλετε να περάσετε εξαρτήσεις χρησιμοποιώντας setters, χρησιμοποιήστε την ενότητα setup για να το κάνετε.

Το Nette DI θα δημιουργήσει απευθείας τον κώδικα PHP για το δοχείο. Το αποτέλεσμα είναι έτσι ένα αρχείο .php το οποίο μπορείτε να ανοίξετε και να μελετήσετε. Αυτό σας επιτρέπει να δείτε ακριβώς πώς λειτουργεί το εμπορευματοκιβώτιο. Μπορείτε επίσης να κάνετε αποσφαλμάτωση στο IDE και να το εξετάσετε βήμα προς βήμα. Και το πιο σημαντικό: η παραγόμενη PHP είναι εξαιρετικά γρήγορη.

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

interface ArticleFactory
{
	function create(): Article;
}

Μπορείτε να βρείτε το πλήρες παράδειγμα στο GitHub.

Αυτόνομη χρήση

Η χρήση της βιβλιοθήκης Nette DI σε μια εφαρμογή είναι πολύ εύκολη. Πρώτα την εγκαθιστούμε με το Composer (επειδή το κατέβασμα αρχείων zip είναι τόσο ξεπερασμένο):

composer require nette/di

Ο παρακάτω κώδικας δημιουργεί μια περίπτωση του δοχείου DI σύμφωνα με τις ρυθμίσεις που είναι αποθηκευμένες στο αρχείο config.neon:

$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp');
$class = $loader->load(function ($compiler) {
	$compiler->loadConfig(__DIR__ . '/config.neon');
});
$container = new $class;

Ο περιέκτης δημιουργείται μόνο μία φορά, ο κώδικάς του εγγράφεται στην κρυφή μνήμη (στον κατάλογο __DIR__ . '/temp' ) και σε επόμενες αιτήσεις διαβάζεται μόνο από εκεί.

Οι μέθοδοι getService() ή getByType() χρησιμοποιούνται για τη δημιουργία και την ανάκτηση υπηρεσιών. Με αυτόν τον τρόπο δημιουργούμε το αντικείμενο UserController:

$database = $container->getByType(UserController::class);
$database->query('...');

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

$loader = new Nette\DI\ContainerLoader(__DIR__ . '/temp', true);

Χρήση με το Nette Framework

Όπως δείξαμε, η χρήση του Nette DI δεν περιορίζεται σε εφαρμογές που έχουν γραφτεί στο Nette Framework, μπορείτε να το αναπτύξετε οπουδήποτε με μόλις 3 γραμμές κώδικα. Ωστόσο, αν αναπτύσσετε εφαρμογές στο Nette Framework, η διαμόρφωση και η δημιουργία του δοχείου αναλαμβάνεται από το Bootstrap.

έκδοση: 3.x