Διαμόρφωση του 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 | αποτέλεσμα |
---|---|---|
|
|
|
Για να αποτρέψετε τη συγχώνευση ενός συγκεκριμένου πίνακα χρησιμοποιήστε θαυμαστικό αμέσως μετά το όνομα του πίνακα:
neon | config2.neon | αποτέλεσμα |
---|---|---|
|
|
|