Ορισμοί υπηρεσιών
Η διαμόρφωση είναι το μέρος όπου δίνουμε οδηγίες στο DI container για το πώς να συναρμολογήσει τις επιμέρους υπηρεσίες και πώς να τις συνδέσει με άλλες εξαρτήσεις. Η Nette παρέχει έναν πολύ σαφή και κομψό τρόπο για να το επιτύχουμε αυτό.
Η ενότητα services
στο αρχείο ρυθμίσεων NEON είναι το σημείο όπου
ορίζουμε τις προσαρμοσμένες υπηρεσίες μας και τις διαμορφώσεις τους.
Ας δούμε ένα απλό παράδειγμα ορισμού μιας υπηρεσίας με το όνομα
database
, η οποία αντιπροσωπεύει μια περίπτωση της κλάσης
PDO
:
Αυτή η διαμόρφωση έχει ως αποτέλεσμα την ακόλουθη εργοστασιακή μέθοδο στο δοχείο DI:
Τα ονόματα υπηρεσιών μας επιτρέπουν να τα αναφέρουμε σε άλλα μέρη του
αρχείου διαμόρφωσης, χρησιμοποιώντας τη μορφή @serviceName
. Εάν δεν
υπάρχει ανάγκη να δώσουμε όνομα στην υπηρεσία, μπορούμε απλά να
χρησιμοποιήσουμε ένα σημείο αναφοράς:
Για να ανακτήσουμε μια υπηρεσία από το δοχείο DI, μπορούμε να
χρησιμοποιήσουμε τη μέθοδο getService()
με το όνομα της υπηρεσίας ως
παράμετρο ή τη μέθοδο getByType()
με τον τύπο της υπηρεσίας:
Δημιουργία υπηρεσιών
Συνήθως, δημιουργούμε μια υπηρεσία απλά με την ενσάρκωση μιας συγκεκριμένης κλάσης. Για παράδειγμα:
Εάν χρειάζεται να επεκτείνουμε τη διαμόρφωση με πρόσθετα κλειδιά, ο ορισμός μπορεί να επεκταθεί σε πολλές γραμμές:
Το κλειδί create
έχει το ψευδώνυμο factory
, και οι δύο εκδοχές
είναι κοινές στην πράξη. Ωστόσο, συνιστούμε τη χρήση του κλειδιού
create
.
Τα ορίσματα του κατασκευαστή ή η μέθοδος δημιουργίας μπορούν
εναλλακτικά να γραφτούν στο κλειδί arguments
:
Οι υπηρεσίες δεν χρειάζεται να δημιουργούνται μόνο με απλή ενσάρκωση μιας κλάσης- μπορούν επίσης να προκύψουν από την κλήση στατικών μεθόδων ή μεθόδων άλλων υπηρεσιών:
Σημειώστε ότι για λόγους απλότητας, αντί για ->
,
χρησιμοποιούμε ::
, βλέπε μέσα έκφρασης. Αυτές
οι εργοστασιακές μέθοδοι δημιουργούνται:
Ο περιέκτης DI πρέπει να γνωρίζει τον τύπο της δημιουργούμενης υπηρεσίας. Αν δημιουργήσουμε μια υπηρεσία χρησιμοποιώντας μια μέθοδο που δεν έχει καθορισμένο τύπο επιστροφής, πρέπει να αναφέρουμε ρητά αυτόν τον τύπο στη διαμόρφωση:
Επιχειρήματα
Παραδίδουμε ορίσματα σε κατασκευαστές και μεθόδους με τρόπο που μοιάζει πολύ με την κανονική PHP:
Για καλύτερη αναγνωσιμότητα, μπορούμε να απαριθμήσουμε τα ορίσματα σε ξεχωριστές γραμμές. Σε αυτή τη μορφή, η χρήση των κομμάτων είναι προαιρετική:
Μπορείτε επίσης να ονομάσετε τα ορίσματα, γεγονός που σας επιτρέπει τότε να μην ανησυχείτε για τη σειρά τους:
Αν θέλετε να παραλείψετε ορισμένα ορίσματα και να χρησιμοποιήσετε τις προεπιλεγμένες τιμές τους ή να εισαγάγετε μια υπηρεσία μέσω αυτόματης καλωδίωσης, χρησιμοποιήστε μια υπογράμμιση:
Τα επιχειρήματα μπορεί να είναι υπηρεσίες, παράμετροι και πολλά άλλα, δείτε τα μέσα έκφρασης.
Εγκατάσταση
Στην ενότητα setup
, ορίζουμε τις μεθόδους που πρέπει να κληθούν
κατά τη δημιουργία της υπηρεσίας.
Σε PHP, αυτό θα έμοιαζε ως εξής:
Εκτός από τις κλήσεις μεθόδων, μπορείτε επίσης να μεταβιβάζετε τιμές σε ιδιότητες. Η προσθήκη ενός στοιχείου σε έναν πίνακα υποστηρίζεται επίσης, αλλά πρέπει να το περικλείσετε σε εισαγωγικά για να αποφύγετε τη σύγκρουση με τη σύνταξη NEON:
Στην PHP, αυτό θα μεταφραζόταν ως εξής:
Στην εγκατάσταση, μπορείτε επίσης να καλέσετε στατικές μεθόδους ή
μεθόδους άλλων υπηρεσιών. Αν πρέπει να περάσετε την τρέχουσα υπηρεσία
ως όρισμα, χρησιμοποιήστε το @self
:
Σημειώστε ότι για λόγους απλότητας, αντί για ->
,
χρησιμοποιούμε ::
, βλέπε μέσα έκφρασης. Αυτό
δημιουργεί την ακόλουθη εργοστασιακή μέθοδο:
Έκφραση Μέσα
Το Nette DI μας παρέχει εξαιρετικά πλούσιες δυνατότητες έκφρασης, επιτρέποντάς μας να εκφράσουμε σχεδόν τα πάντα. Στα αρχεία ρυθμίσεων, μπορούμε να χρησιμοποιούμε παραμέτρους:
Μπορούμε επίσης να δημιουργήσουμε αντικείμενα, να καλέσουμε μεθόδους και συναρτήσεις:
Να αναφερόμαστε σε υπηρεσίες είτε με το όνομά τους είτε με τον τύπο τους:
Χρησιμοποιήστε σύνταξη πρώτης κατηγορίας callable:
Χρήση σταθερών:
όπως ακριβώς και στην PHP. Για λόγους απλότητας, αντί του ->
,
χρησιμοποιούμε το ::
:
Αυτές οι εκφράσεις μπορούν να χρησιμοποιηθούν οπουδήποτε κατά τη δημιουργία υπηρεσιών, σε ορίσματα, στο τμήμα εγκατάστασης ή σε παραμέτρους:
Ειδικές λειτουργίες
Μέσα σε αρχεία ρυθμίσεων, μπορείτε να χρησιμοποιήσετε αυτές τις ειδικές λειτουργίες:
not()
για άρνηση τιμώνbool()
,int()
,float()
,string()
για μετατροπή τύπου χωρίς απώλειεςtyped()
για τη δημιουργία ενός πίνακα όλων των υπηρεσιών ενός συγκεκριμένου τύπουtagged()
για τη δημιουργία ενός πίνακα όλων των υπηρεσιών με μια συγκεκριμένη ετικέτα
Σε σύγκριση με το συμβατικό typecasting στην PHP, όπως το (int)
, το lossless
type casting θα πετάξει μια εξαίρεση για μη αριθμητικές τιμές.
Η συνάρτηση typed()
δημιουργεί έναν πίνακα όλων των υπηρεσιών
ενός συγκεκριμένου τύπου (κλάση ή διεπαφή). Εξαιρεί τις υπηρεσίες με
απενεργοποιημένη την αυτόματη σύνδεση. Μπορούν να καθοριστούν
πολλαπλοί τύποι, χωρισμένοι με κόμμα.
Μπορείτε επίσης να περάσετε αυτόματα έναν πίνακα υπηρεσιών ενός συγκεκριμένου τύπου ως όρισμα χρησιμοποιώντας την αυτόματη καλωδίωση.
Η συνάρτηση tagged()
δημιουργεί έναν πίνακα όλων των υπηρεσιών με
μια καθορισμένη ετικέτα. Μπορούν να παρατίθενται πολλαπλές ετικέτες,
διαχωρισμένες με κόμμα.
Αυτόματη καλωδίωση
Το κλειδί autowired
σας επιτρέπει να τροποποιήσετε τη συμπεριφορά
αυτόματης καλωδίωσης για μια συγκεκριμένη υπηρεσία. Για περισσότερες
λεπτομέρειες, ανατρέξτε στο κεφάλαιο αυτόματη
σύνδεση.
Τεμπέλικες υπηρεσίες
Η τεμπέλικη φόρτωση είναι μια τεχνική που καθυστερεί τη δημιουργία μιας υπηρεσίας μέχρι να την χρειαστεί πραγματικά. Μπορείτε να ενεργοποιήσετε τη δημιουργία τεμπέλικων υπηρεσιών συνολικά στη διαμόρφωση για όλες τις υπηρεσίες ταυτόχρονα. Για μεμονωμένες υπηρεσίες, αυτή η συμπεριφορά μπορεί να παρακαμφθεί:
Όταν μια υπηρεσία ορίζεται ως τεμπέλικη, η αίτησή της από το DI container θα επιστρέφει ένα ειδικό αντικείμενο proxy. Αυτός ο πληρεξούσιος μοιάζει και συμπεριφέρεται όπως η πραγματική υπηρεσία, αλλά η πραγματική αρχικοποίηση (κλήση κατασκευαστή και ρύθμιση) θα γίνει μόνο κατά την πρώτη κλήση οποιασδήποτε μεθόδου ή ιδιότητάς της.
Το Lazy loading μπορεί να χρησιμοποιηθεί μόνο για κλάσεις που ορίζονται από τον χρήστη, όχι για εσωτερικές κλάσεις της PHP. Απαιτεί PHP 8.4 ή νεότερη έκδοση.
Ετικέτες
Οι ετικέτες χρησιμοποιούνται για την προσθήκη συμπληρωματικών πληροφοριών στις υπηρεσίες. Μπορείτε να αντιστοιχίσετε μία ή περισσότερες ετικέτες σε μια υπηρεσία:
Οι ετικέτες μπορούν επίσης να φέρουν τιμές:
Για να ανακτήσετε όλες τις υπηρεσίες με συγκεκριμένες ετικέτες,
μπορείτε να χρησιμοποιήσετε τη λειτουργία tagged()
:
Στο δοχείο DI, μπορείτε να λάβετε τα ονόματα όλων των υπηρεσιών με μια
συγκεκριμένη ετικέτα χρησιμοποιώντας τη μέθοδο findByTag()
:
Λειτουργία έγχυσης
Η χρήση της σημαίας inject: true
ενεργοποιεί τη μεταβίβαση
εξαρτήσεων μέσω δημόσιων μεταβλητών με το σχόλιο inject και τις μεθόδους inject*().
Από προεπιλογή, το inject
είναι ενεργοποιημένο μόνο για τους
παρουσιαστές.
Τροποποιήσεις υπηρεσιών
Ο περιέκτης DI περιέχει πολλές υπηρεσίες που προστίθενται είτε από
ενσωματωμένες είτε από επεκτάσεις χρηστών. Μπορείτε
να τροποποιήσετε τους ορισμούς αυτών των υπηρεσιών απευθείας στη
διαμόρφωση. Για παράδειγμα, μπορείτε να αλλάξετε την κλάση της
υπηρεσίας application.application
, η οποία είναι συμβατικά
Nette\Application\Application
, σε κάτι άλλο:
Η σημαία alteration
είναι πληροφοριακή, υποδεικνύοντας ότι απλώς
τροποποιούμε μια υπάρχουσα υπηρεσία.
Μπορούμε επίσης να συμπληρώσουμε τη ρύθμιση:
Εδώ είναι που το reset
είναι χρήσιμο:
Αν θέλετε να αφαιρέσετε μια υπηρεσία που προστέθηκε από μια επέκταση, μπορείτε να το κάνετε ως εξής: