Nette Documentation Preview

syntax
Πώς να φορτώσετε το αρχείο ρυθμίσεων
************************************

.[perex]
Τα επιμέρους στοιχεία της Nette διαμορφώνονται με τη χρήση αρχείων διαμόρφωσης. Θα δείξουμε πώς να φορτώσετε αυτά τα αρχεία.

.[tip]
Αν χρησιμοποιείτε ολόκληρο το πλαίσιο, δεν χρειάζεται να κάνετε τίποτα άλλο. Στο έργο, έχετε έναν προ-προετοιμασμένο κατάλογο `config/` για τα αρχεία διαμόρφωσης και ο [φορτωτής της εφαρμογής |application:bootstrap#DI Container Configuration] είναι υπεύθυνος για τη φόρτωσή τους.
Αυτό το άρθρο απευθύνεται σε χρήστες που χρησιμοποιούν μόνο μία βιβλιοθήκη Nette και θέλουν να επωφεληθούν από τα αρχεία διαμόρφωσης.

Τα αρχεία διαμόρφωσης είναι συνήθως γραμμένα σε [NEON |neon:format] και είναι καλύτερο να τα επεξεργάζεστε σε [επεξεργαστές με υποστήριξη για αυτό |best-practices:editors-and-tools#ide-editor]. Μπορούν να θεωρηθούν ως οδηγίες για το πώς να **δημιουργήσετε και να διαμορφώσετε** αντικείμενα. Έτσι, το αποτέλεσμα της φόρτωσης μιας διαμόρφωσης θα είναι ένα λεγόμενο εργοστάσιο, το οποίο είναι ένα αντικείμενο που θα δημιουργεί κατ' απαίτηση άλλα αντικείμενα που θέλετε να χρησιμοποιήσετε. Για παράδειγμα, μια σύνδεση με βάση δεδομένων κ.λπ.

Αυτό το εργοστάσιο ονομάζεται επίσης *περιέκτης έγχυσης εξαρτήσεων* (DI container) και αν σας ενδιαφέρουν οι λεπτομέρειες, διαβάστε το κεφάλαιο για την [έγχυση εξαρτήσεων |dependency-injection:].

Η φόρτωση των ρυθμίσεων και η δημιουργία του container γίνεται από την κλάση [api:Nette\Bootstrap\Configurator], οπότε θα εγκαταστήσουμε πρώτα το πακέτο της `nette/bootstrap`:

```shell
composer require nette/bootstrap
```

Και θα δημιουργήσουμε μια περίπτωση της κλάσης `Configurator`. Δεδομένου ότι το παραγόμενο δοχείο DI θα αποθηκευτεί στο δίσκο, πρέπει να ορίσετε τη διαδρομή προς τον κατάλογο όπου θα αποθηκευτεί:

```php
$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');
```

Σε Linux ή macOS, ορίστε τα [δικαιώματα εγγραφής |nette:troubleshooting#Setting directory permissions] για τον κατάλογο `temp/`.

Και ερχόμαστε στα ίδια τα αρχεία ρυθμίσεων. Αυτά φορτώνονται χρησιμοποιώντας το `addConfig()`:

```php
$configurator->addConfig(__DIR__ . '/database.neon');
```

Αν θέλετε να προσθέσετε περισσότερα αρχεία ρυθμίσεων, μπορείτε να καλέσετε τη συνάρτηση `addConfig()` πολλές φορές. Εάν στοιχεία με τα ίδια κλειδιά εμφανίζονται στα αρχεία, θα αντικατασταθούν (ή θα [συγχωνευθούν |dependency-injection:configuration#Merging] στην περίπτωση των πινάκων). Ένα αρχείο που εισάγεται αργότερα έχει υψηλότερη προτεραιότητα από το προηγούμενο.

Το τελευταίο βήμα είναι η δημιουργία ενός δοχείου DI:

```php
$container = $configurator->createContainer();
```

Και αυτό θα δημιουργήσει ήδη τα επιθυμητά αντικείμενα για εμάς. Για παράδειγμα, αν χρησιμοποιείτε τη διαμόρφωση για [τη Nette Database |database:configuration], μπορείτε να του ζητήσετε να δημιουργήσει συνδέσεις βάσης δεδομένων:

```php
$db = $container->getByType(Nette\Database\Connection::class);
// ή
$explorer = $container->getByType(Nette\Database\Explorer::class);
// ή κατά τη δημιουργία πολλαπλών συνδέσεων
$db = $container->getByName('database.main.connection');
```

Και τώρα μπορείτε να εργαστείτε με τη βάση δεδομένων!


Λειτουργία ανάπτυξης έναντι παραγωγής .[#toc-development-vs-production-mode]
----------------------------------------------------------------------------

Στη λειτουργία ανάπτυξης, ο περιέκτης ενημερώνεται αυτόματα κάθε φορά που αλλάζουν τα αρχεία ρυθμίσεων. Στη λειτουργία παραγωγής, δημιουργείται μόνο μία φορά και οι αλλαγές δεν ελέγχονται.
Έτσι, η λειτουργία ανάπτυξης στοχεύει στη μέγιστη ευκολία του προγραμματιστή, ενώ η λειτουργία παραγωγής στοχεύει στην απόδοση.

Η επιλογή του τρόπου λειτουργίας γίνεται με αυτόματη ανίχνευση, οπότε συνήθως δεν χρειάζεται να ρυθμίσετε ή να αλλάξετε χειροκίνητα κάτι. Η κατάσταση λειτουργίας είναι development όταν η εφαρμογή εκτελείται σε ένα localhost (δηλ. διεύθυνση IP `127.0.0.1` ή `::1`) και δεν υπάρχει proxy (δηλ. η επικεφαλίδα HTTP του). Διαφορετικά εκτελείται σε κατάσταση παραγωγής.

Αν θέλετε να ενεργοποιήσετε τη λειτουργία ανάπτυξης σε άλλες περιπτώσεις, όπως για παράδειγμα για προγραμματιστές που έχουν πρόσβαση από μια συγκεκριμένη διεύθυνση IP, χρησιμοποιήστε τη διεύθυνση `setDebugMode()`:

```php
$configurator->setDebugMode('23.75.345.200');
// μπορεί επίσης να καθοριστεί ένας πίνακας διευθύνσεων IP
```

Συνιστούμε οπωσδήποτε τον συνδυασμό της διεύθυνσης IP με ένα cookie. Αποθηκεύστε ένα μυστικό κουπόνι, π.χ. `secret1234`, στο cookie `nette-debug`, και με αυτόν τον τρόπο ενεργοποιείτε τη λειτουργία ανάπτυξης για προγραμματιστές που έχουν πρόσβαση από συγκεκριμένη διεύθυνση IP και έχουν επίσης το κουπόνι που αναφέρεται στο cookie:

```php
$configurator->setDebugMode('secret1234@23.75.345.200');
```

Μπορείτε επίσης να απενεργοποιήσετε εντελώς τη λειτουργία ανάπτυξης, ακόμη και για το localhost:

```php
$configurator->setDebugMode(false);
```


Παράμετροι .[#toc-parameters]
-----------------------------

Μπορείτε επίσης να χρησιμοποιήσετε παραμέτρους σε αρχεία ρυθμίσεων, οι οποίες ορίζονται [στην ενότητα `parameters`  |dependency-injection:configuration#parameters`].

Μπορούν επίσης να εισαχθούν από έξω χρησιμοποιώντας τη μέθοδο `addDynamicParameters()`:

```php
$configurator->addDynamicParameters([
	'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);
```

Η παράμετρος `projectId` μπορεί να αναφέρεται στη διαμόρφωση με τον συμβολισμό `%projectId%`.


{{leftbar: nette:@menu-topics}}

Πώς να φορτώσετε το αρχείο ρυθμίσεων

Τα επιμέρους στοιχεία της Nette διαμορφώνονται με τη χρήση αρχείων διαμόρφωσης. Θα δείξουμε πώς να φορτώσετε αυτά τα αρχεία.

Αν χρησιμοποιείτε ολόκληρο το πλαίσιο, δεν χρειάζεται να κάνετε τίποτα άλλο. Στο έργο, έχετε έναν προ-προετοιμασμένο κατάλογο config/ για τα αρχεία διαμόρφωσης και ο φορτωτής της εφαρμογής είναι υπεύθυνος για τη φόρτωσή τους. Αυτό το άρθρο απευθύνεται σε χρήστες που χρησιμοποιούν μόνο μία βιβλιοθήκη Nette και θέλουν να επωφεληθούν από τα αρχεία διαμόρφωσης.

Τα αρχεία διαμόρφωσης είναι συνήθως γραμμένα σε NEON και είναι καλύτερο να τα επεξεργάζεστε σε επεξεργαστές με υποστήριξη για αυτό. Μπορούν να θεωρηθούν ως οδηγίες για το πώς να δημιουργήσετε και να διαμορφώσετε αντικείμενα. Έτσι, το αποτέλεσμα της φόρτωσης μιας διαμόρφωσης θα είναι ένα λεγόμενο εργοστάσιο, το οποίο είναι ένα αντικείμενο που θα δημιουργεί κατ' απαίτηση άλλα αντικείμενα που θέλετε να χρησιμοποιήσετε. Για παράδειγμα, μια σύνδεση με βάση δεδομένων κ.λπ.

Αυτό το εργοστάσιο ονομάζεται επίσης περιέκτης έγχυσης εξαρτήσεων (DI container) και αν σας ενδιαφέρουν οι λεπτομέρειες, διαβάστε το κεφάλαιο για την έγχυση εξαρτήσεων.

Η φόρτωση των ρυθμίσεων και η δημιουργία του container γίνεται από την κλάση Nette\Bootstrap\Configurator, οπότε θα εγκαταστήσουμε πρώτα το πακέτο της nette/bootstrap:

composer require nette/bootstrap

Και θα δημιουργήσουμε μια περίπτωση της κλάσης Configurator. Δεδομένου ότι το παραγόμενο δοχείο DI θα αποθηκευτεί στο δίσκο, πρέπει να ορίσετε τη διαδρομή προς τον κατάλογο όπου θα αποθηκευτεί:

$configurator = new Nette\Bootstrap\Configurator;
$configurator->setTempDirectory(__DIR__ . '/temp');

Σε Linux ή macOS, ορίστε τα δικαιώματα εγγραφής για τον κατάλογο temp/.

Και ερχόμαστε στα ίδια τα αρχεία ρυθμίσεων. Αυτά φορτώνονται χρησιμοποιώντας το addConfig():

$configurator->addConfig(__DIR__ . '/database.neon');

Αν θέλετε να προσθέσετε περισσότερα αρχεία ρυθμίσεων, μπορείτε να καλέσετε τη συνάρτηση addConfig() πολλές φορές. Εάν στοιχεία με τα ίδια κλειδιά εμφανίζονται στα αρχεία, θα αντικατασταθούν (ή θα συγχωνευθούν στην περίπτωση των πινάκων). Ένα αρχείο που εισάγεται αργότερα έχει υψηλότερη προτεραιότητα από το προηγούμενο.

Το τελευταίο βήμα είναι η δημιουργία ενός δοχείου DI:

$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');

Και τώρα μπορείτε να εργαστείτε με τη βάση δεδομένων!

Λειτουργία ανάπτυξης έναντι παραγωγής

Στη λειτουργία ανάπτυξης, ο περιέκτης ενημερώνεται αυτόματα κάθε φορά που αλλάζουν τα αρχεία ρυθμίσεων. Στη λειτουργία παραγωγής, δημιουργείται μόνο μία φορά και οι αλλαγές δεν ελέγχονται. Έτσι, η λειτουργία ανάπτυξης στοχεύει στη μέγιστη ευκολία του προγραμματιστή, ενώ η λειτουργία παραγωγής στοχεύει στην απόδοση.

Η επιλογή του τρόπου λειτουργίας γίνεται με αυτόματη ανίχνευση, οπότε συνήθως δεν χρειάζεται να ρυθμίσετε ή να αλλάξετε χειροκίνητα κάτι. Η κατάσταση λειτουργίας είναι development όταν η εφαρμογή εκτελείται σε ένα localhost (δηλ. διεύθυνση IP 127.0.0.1 ή ::1) και δεν υπάρχει proxy (δηλ. η επικεφαλίδα HTTP του). Διαφορετικά εκτελείται σε κατάσταση παραγωγής.

Αν θέλετε να ενεργοποιήσετε τη λειτουργία ανάπτυξης σε άλλες περιπτώσεις, όπως για παράδειγμα για προγραμματιστές που έχουν πρόσβαση από μια συγκεκριμένη διεύθυνση IP, χρησιμοποιήστε τη διεύθυνση setDebugMode():

$configurator->setDebugMode('23.75.345.200');
// μπορεί επίσης να καθοριστεί ένας πίνακας διευθύνσεων IP

Συνιστούμε οπωσδήποτε τον συνδυασμό της διεύθυνσης IP με ένα cookie. Αποθηκεύστε ένα μυστικό κουπόνι, π.χ. secret1234, στο cookie nette-debug, και με αυτόν τον τρόπο ενεργοποιείτε τη λειτουργία ανάπτυξης για προγραμματιστές που έχουν πρόσβαση από συγκεκριμένη διεύθυνση IP και έχουν επίσης το κουπόνι που αναφέρεται στο cookie:

$configurator->setDebugMode('secret1234@23.75.345.200');

Μπορείτε επίσης να απενεργοποιήσετε εντελώς τη λειτουργία ανάπτυξης, ακόμη και για το localhost:

$configurator->setDebugMode(false);

Παράμετροι

Μπορείτε επίσης να χρησιμοποιήσετε παραμέτρους σε αρχεία ρυθμίσεων, οι οποίες ορίζονται στην ενότητα parameters.

Μπορούν επίσης να εισαχθούν από έξω χρησιμοποιώντας τη μέθοδο addDynamicParameters():

$configurator->addDynamicParameters([
	'remoteIp' => $_SERVER['REMOTE_ADDR'],
]);

Η παράμετρος projectId μπορεί να αναφέρεται στη διαμόρφωση με τον συμβολισμό %projectId%.