Πώς να φορτώσετε ένα αρχείο διαμόρφωσης
Τα διάφορα μέρη του Nette διαμορφώνονται χρησιμοποιώντας αρχεία διαμόρφωσης. Θα δείξουμε πώς να φορτώνετε αυτά τα αρχεία.
Αν χρησιμοποιείτε ολόκληρο το framework, δεν χρειάζεται να κάνετε
τίποτα άλλο. Στο έργο σας, έχετε έναν προετοιμασμένο κατάλογο
config/
για αρχεία διαμόρφωσης, και η φόρτωσή τους αναλαμβάνεται
από τον φορτωτή της
εφαρμογής. Αυτό το άρθρο είναι για χρήστες που χρησιμοποιούν μόνο
μία βιβλιοθήκη Nette και θέλουν να εκμεταλλευτούν τις δυνατότητες των
αρχείων διαμόρφωσης.
Τα αρχεία διαμόρφωσης συνήθως γράφονται σε μορφή NEON και επεξεργάζονται καλύτερα σε editors με υποστήριξη για αυτό. Μπορούν να θεωρηθούν ως οδηγίες για το πώς να δημιουργείτε και να διαμορφώνετε αντικείμενα. Έτσι, το αποτέλεσμα της φόρτωσης της διαμόρφωσης θα είναι ένα λεγόμενο factory, το οποίο είναι ένα αντικείμενο που, κατόπιν αιτήματος, θα δημιουργήσει άλλα αντικείμενα που θέλουμε να χρησιμοποιήσουμε. Για παράδειγμα, συνδέσεις βάσης δεδομένων κ.λπ.
Αυτό το factory ονομάζεται επίσης dependency injection container (DI container) και αν σας ενδιαφέρουν οι λεπτομέρειες, διαβάστε το κεφάλαιο για το dependency injection.
Η φόρτωση της διαμόρφωσης και η δημιουργία του container αναλαμβάνεται
από την κλάση Nette\Bootstrap\Configurator, οπότε
πρώτα θα εγκαταστήσουμε το πακέτο της nette/bootstrap
:
composer require nette/bootstrap
Και θα δημιουργήσουμε ένα στιγμιότυπο της κλάσης Configurator
.
Επειδή ο παραγόμενος DI container θα αποθηκευτεί προσωρινά στον δίσκο, είναι
απαραίτητο να ορίσουμε τη διαδρομή προς τον κατάλογο όπου θα
αποθηκευτεί:
$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');
Σε Linux ή macOS, ορίστε δικαιώματα εγγραφής στον
κατάλογο temp/
.
Και φτάνουμε στα ίδια τα αρχεία διαμόρφωσης. Τα φορτώνουμε
χρησιμοποιώντας το addConfig()
:
$configurator->addConfig(__DIR__ . '/database.neon');
Αν θέλουμε να προσθέσουμε περισσότερα αρχεία διαμόρφωσης, μπορούμε
να καλέσουμε τη συνάρτηση addConfig()
πολλές φορές. Αν εμφανιστούν
στοιχεία με τα ίδια κλειδιά στα αρχεία, θα αντικατασταθούν (ή στην
περίπτωση πινάκων θα
συγχωνευθούν). Το αρχείο που εισάγεται αργότερα έχει υψηλότερη
προτεραιότητα από το προηγούμενο.
Το τελευταίο βήμα είναι η δημιουργία του DI container:
$container = $configurator->createContainer();
Και αυτός θα δημιουργήσει για εμάς τα απαιτούμενα αντικείμενα. Για παράδειγμα, αν χρησιμοποιείτε τη διαμόρφωση για το Nette Database, μπορείτε να του ζητήσετε να δημιουργήσει συνδέσεις βάσης δεδομένων:
$db = $container->getByType(Nette\Database\Connection::class);
// ή
$explorer = $container->getByType(Nette\Database\Explorer::class);
// ή κατά τη δημιουργία πολλαπλών συνδέσεων
$db = $container->getByName('database.main.connection');
Και τώρα μπορείτε να εργαστείτε με τη βάση δεδομένων!
Κατάσταση ανάπτυξης vs παραγωγής
Στην κατάσταση ανάπτυξης, ο container ενημερώνεται αυτόματα κάθε φορά που αλλάζουν τα αρχεία διαμόρφωσης. Στην κατάσταση παραγωγής, δημιουργείται μόνο μία φορά και οι αλλαγές δεν ελέγχονται. Η κατάσταση ανάπτυξης επικεντρώνεται στην μέγιστη άνεση του προγραμματιστή, ενώ η κατάσταση παραγωγής στην απόδοση και την πραγματική ανάπτυξη.
Η επιλογή της κατάστασης γίνεται μέσω αυτόματης ανίχνευσης, οπότε
συνήθως δεν χρειάζεται να διαμορφώσετε ή να αλλάξετε κάτι χειροκίνητα.
Η κατάσταση είναι ανάπτυξης εάν η εφαρμογή εκτελείται σε localhost (δηλ.
διεύθυνση IP 127.0.0.1
ή ::1
) και δεν υπάρχει proxy (δηλ. η κεφαλίδα
HTTP του). Διαφορετικά, εκτελείται σε κατάσταση παραγωγής.
Αν θέλουμε να ενεργοποιήσουμε την κατάσταση ανάπτυξης και σε άλλες
περιπτώσεις, για παράδειγμα για προγραμματιστές που έχουν πρόσβαση
από μια συγκεκριμένη διεύθυνση IP, χρησιμοποιούμε το setDebugMode()
:
$configurator->setDebugMode('23.75.345.200');
// μπορεί να δοθεί και ένας πίνακας διευθύνσεων IP
Συνιστούμε ανεπιφύλακτα τον συνδυασμό της διεύθυνσης IP με ένα cookie.
Στο cookie nette-debug
αποθηκεύουμε ένα μυστικό token, π.χ. secret1234
,
και με αυτόν τον τρόπο ενεργοποιούμε την κατάσταση ανάπτυξης για
προγραμματιστές που έχουν πρόσβαση από μια συγκεκριμένη διεύθυνση IP
και ταυτόχρονα έχουν το αναφερόμενο token στο cookie:
$configurator->setDebugMode('secret1234@23.75.345.200');
Μπορούμε επίσης να απενεργοποιήσουμε εντελώς την κατάσταση ανάπτυξης, ακόμη και για localhost:
$configurator->setDebugMode(false);
Παράμετροι
Στα αρχεία διαμόρφωσης μπορείτε επίσης να χρησιμοποιήσετε
παραμέτρους, οι οποίες ορίζονται στην ενότητα
parameters
.
Μπορούν επίσης να εισαχθούν από έξω χρησιμοποιώντας τη μέθοδο
addDynamicParameters()
:
$configurator->addDynamicParameters([
'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
Στην παράμετρο projectId
μπορεί να γίνει αναφορά στη διαμόρφωση με
τη σύνταξη %projectId%
.