Διαμόρφωση του DI Container

Επισκόπηση των επιλογών διαμόρφωσης για το δοχείο DI της Nette.

Αρχείο διαμόρφωσης

Το δοχείο Nette DI είναι εύκολο να ελεγχθεί με τη χρήση αρχείων διαμόρφωσης. Συνήθως είναι γραμμένα σε μορφή NEON. Συνιστούμε να χρησιμοποιείτε για την επεξεργασία επεξεργαστές με υποστήριξη αυτής της μορφής.

 decorator: 	Decorator
di: DI Container
extensions: Εγκατάσταση πρόσθετων επεκτάσεων DI
includes: Συμπεριλαμβανομένων αρχείων
parameters: Παράμετροι
search: Αυτόματη καταχώρηση υπηρεσιών
services: Υπηρεσίες

Για να γράψετε μια συμβολοσειρά που περιέχει τον χαρακτήρα %, you must escape it by doubling it to %%.

Παράμετροι

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

parameters:
	dsn: 'mysql:host=127.0.0.1;dbname=test'
	user: root
	password: secret

Μπορείτε να ανατρέξετε στην παράμετρο foo μέσω της διεύθυνσης %foo% σε οποιοδήποτε άλλο σημείο του αρχείου ρυθμίσεων. Μπορούν επίσης να χρησιμοποιηθούν μέσα σε συμβολοσειρές όπως το '%wwwDir%/images'.

Οι παράμετροι δεν χρειάζεται να είναι μόνο συμβολοσειρές, μπορούν επίσης να είναι τιμές πίνακα:

parameters:
	mailer:
		host: smtp.example.com
		secure: ssl
		user: franta@gmail.com
	languages: [cs, en, de]

Μπορείτε να αναφέρεστε σε ένα μόνο κλειδί ως %mailer.user%.

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

Υπηρεσίες

Βλέπε ξεχωριστό κεφάλαιο.

Διακοσμητής

Πώς μπορώ να επεξεργαστώ μαζικά όλες τις υπηρεσίες ενός συγκεκριμένου τύπου; Πρέπει να καλέσετε μια συγκεκριμένη μέθοδο για όλους τους παρουσιαστές που κληρονομούν από έναν συγκεκριμένο κοινό πρόγονο; Από εκεί προέρχεται ο διακοσμητής.

decorator:
	# για όλες τις υπηρεσίες που είναι στιγμιότυπα αυτής της κλάσης ή διεπαφής
	App\UI\BasePresenter:
		setup:
			- setProjectId(10)       # καλέστε αυτή τη μέθοδο
			- $absoluteUrls = true   # και ορίστε τη μεταβλητή

Ο διακοσμητής μπορεί επίσης να χρησιμοποιηθεί για να ορίσετε ετικέτες ή να ενεργοποιήσετε τη λειτουργία inject.

decorator:
	InjectableInterface:
		tags: [mytag: 1]
		inject: true

DI

Τεχνικές ρυθμίσεις του δοχείου DI.

di:
	# δείχνει DIC στο Tracy Bar;
	debugger: ...        # (bool) προεπιλογή true

	# τύποι παραμέτρων που δεν συνδέετε ποτέ αυτόματα
	excluded: ...        # (string[])

	# η κλάση από την οποία κληρονομεί ο περιέκτης DI
	parentClass: ...     # (string) προεπιλογή Nette\DI\Container

Εξαγωγή μεταδεδομένων

Η κλάση DI container περιέχει επίσης πολλά μεταδεδομένα. Μπορείτε να τα μειώσετε μειώνοντας την εξαγωγή μεταδεδομένων.

di:
	export:
		# για την εξαγωγή παραμέτρων;
		parameters: false   # (bool) προεπιλογή true

		# να εξάγει ετικέτες και ποιες;
		tags:               # (string[]|bool) η προεπιλογή είναι όλες
			- event.subscriber

		# export data for autowiring and which?
		types:              # (string[]|bool) η προεπιλογή είναι όλα
			- Nette\Database\Connection
			- Symfony\Component\Console\Application

Εάν δεν χρησιμοποιείτε τον πίνακα $container->getParameters(), μπορείτε να απενεργοποιήσετε την εξαγωγή παραμέτρων. Επιπλέον, μπορείτε να εξάγετε μόνο τις ετικέτες μέσω των οποίων λαμβάνετε υπηρεσίες χρησιμοποιώντας τη μέθοδο $container->findByTag(...). Αν δεν καλείτε καθόλου τη μέθοδο, μπορείτε να απενεργοποιήσετε εντελώς την εξαγωγή ετικετών με τη μέθοδο false.

Μπορείτε να μειώσετε σημαντικά τα μεταδεδομένα για την αυτόματη καλωδίωση, καθορίζοντας τις κλάσεις που χρησιμοποιείτε ως παράμετρο στη μέθοδο $container->getByType(). Και πάλι, αν δεν καλέσετε καθόλου τη μέθοδο (ή μόνο στο bootstrap για να λάβετε το Nette\Application\Application), μπορείτε να απενεργοποιήσετε εντελώς την εξαγωγή με το false.

Επεκτάσεις

Καταχώρηση άλλων επεκτάσεων DI. Με αυτόν τον τρόπο προσθέτουμε, για παράδειγμα, την επέκταση DI Dibi\Bridges\Nette\DibiExtension22 με το όνομα dibi:

extensions:
	dibi: Dibi\Bridges\Nette\DibiExtension22

Στη συνέχεια, τη διαμορφώνουμε στο τμήμα της που ονομάζεται επίσης dibi:

dibi:
	host: localhost

Μπορείτε επίσης να προσθέσετε μια κλάση επέκτασης με παραμέτρους:

extensions:
	application: Nette\Bridges\ApplicationDI\ApplicationExtension(%debugMode%, %appDir%, %tempDir%/cache)

Συμπεριλαμβανομένων αρχείων

Πρόσθετα αρχεία ρυθμίσεων μπορούν να εισαχθούν στην ενότητα includes:

includes:
	- parameters.php
	- services.neon
	- presenters.neon

parameters.php Η διαμόρφωση μπορεί επίσης να γραφτεί σε ένα αρχείο PHP, το οποίο την επιστρέφει ως πίνακα:

<?php
return [
	'database' => [
		'main' => [
			'dsn' => 'sqlite::memory:',
		],
	],
];

Εάν στοιχεία με τα ίδια κλειδιά εμφανίζονται μέσα σε αρχεία ρυθμίσεων, θα αντικατασταθούν ή θα συγχωνευθούν στην περίπτωση των πινάκων. Το αρχείο που περιλαμβάνεται αργότερα έχει υψηλότερη προτεραιότητα από το προηγούμενο. Το αρχείο στο οποίο παρατίθεται το τμήμα includes έχει υψηλότερη προτεραιότητα από τα αρχεία που περιλαμβάνονται σε αυτό.

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

Απλά καθορίστε σε ποιους καταλόγους (και υποκαταλόγους) θα πρέπει να αναζητηθούν οι κλάσεις:

search:
	-	in: %appDir%/Forms
	-	in: %appDir%/Model

Συνήθως, όμως, δεν θέλουμε να προσθέσουμε όλες τις κλάσεις και τις διεπαφές, οπότε μπορούμε να τις φιλτράρουμε:

search:
	-	in: %appDir%/Forms

		# φιλτράρισμα με βάση το όνομα αρχείου (string|string[])
		files:
			- *Factory.php

		# φιλτράρισμα με βάση το όνομα κλάσης (string|string[])
		classes:
			- *Factory

Ή μπορούμε να επιλέξουμε κλάσεις που κληρονομούν ή υλοποιούν τουλάχιστον μία από τις ακόλουθες κλάσεις:

search:
	-	in: %appDir%
		extends:
			- App\*Form
		implements:
			- App\*FormInterface

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

search:
	-	in: %appDir%
		exclude:
αρχεία: ...
			classes: ...
			extends: ...
			implements: ...

Μπορούν να οριστούν ετικέτες για τις υπηρεσίες που προστίθενται:

search:
	-	in: %appDir%
		tags: ...

Συγχώνευση

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

config1.neon config2.neon αποτέλεσμα
items:
	- 1
	- 2
items:
	- 3
items:
	- 1
	- 2
	- 3

Για να αποτρέψετε τη συγχώνευση ενός συγκεκριμένου πίνακα χρησιμοποιήστε θαυμαστικό αμέσως μετά το όνομα του πίνακα:

neon config2.neon αποτέλεσμα
items:
	- 1
	- 2
items!:
	- 3
items:
	- 3
έκδοση: 3.x