Nette Documentation Preview

syntax
Bootstrap
*********

<div class=perex>

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

- πώς να ρυθμίσετε την εφαρμογή σας χρησιμοποιώντας αρχεία NEON
- πώς να χειρίζεστε τις λειτουργίες παραγωγής και ανάπτυξης
- πώς να δημιουργήσετε το δοχείο DI

</div>


Οι εφαρμογές, είτε βασίζονται στο διαδίκτυο είτε σε σενάρια γραμμής εντολών, ξεκινούν με κάποια μορφή αρχικοποίησης του περιβάλλοντος. Στην αρχαιότητα, θα μπορούσε να είναι ένα αρχείο με το όνομα eg `include.inc.php` που ήταν υπεύθυνο γι' αυτό και συμπεριλαμβανόταν στο αρχικό αρχείο.
Στις σύγχρονες εφαρμογές Nette, έχει αντικατασταθεί από την κλάση `Bootstrap`, η οποία ως μέρος της εφαρμογής μπορεί να βρεθεί στο `app/Bootstrap.php`. Μπορεί να μοιάζει για παράδειγμα ως εξής:

```php
use Nette\Bootstrap\Configurator;

class Bootstrap
{
	public static function boot(): Configurator
	{
		$appDir = dirname(__DIR__);
		$configurator = new Configurator;
		//$configurator->setDebugMode('secret@23.75.345.200');
		$configurator->enableTracy($appDir . '/log');
		$configurator->setTempDirectory($appDir . '/temp');
		$configurator->createRobotLoader()
			->addDirectory(__DIR__)
			->register();
		$configurator->addConfig($appDir . '/config/common.neon');
		return $configurator;
	}
}
```


index.php .[#toc-index-php]
===========================

Στην περίπτωση των διαδικτυακών εφαρμογών, το αρχικό αρχείο είναι το `index.php`, το οποίο βρίσκεται στον δημόσιο κατάλογο `www/`. Επιτρέπει στην κλάση `Bootstrap` να αρχικοποιήσει το περιβάλλον και να επιστρέψει το `$configurator` που δημιουργεί το DI container. Στη συνέχεια αποκτά την υπηρεσία `Application`, η οποία εκτελεί την εφαρμογή ιστού:

```php
// αρχικοποίηση του περιβάλλοντος + λήψη του αντικειμένου Configurator
$configurator = App\Bootstrap::boot();
// Δημιουργία ενός δοχείου DI
$container = $configurator->createContainer();
// Το δοχείο DI δημιουργεί ένα αντικείμενο Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
// έναρξη της εφαρμογής Nette
$application->run();
```

Όπως βλέπετε, η κλάση [api:Nette\Bootstrap\Configurator], την οποία θα παρουσιάσουμε τώρα με περισσότερες λεπτομέρειες, βοηθάει στη ρύθμιση του περιβάλλοντος και στη δημιουργία ενός δοχείου έγχυσης εξαρτήσεων (DI).


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

Η Nette διακρίνει μεταξύ δύο βασικών τρόπων εκτέλεσης μιας αίτησης: ανάπτυξη και παραγωγή. Η λειτουργία ανάπτυξης επικεντρώνεται στη μέγιστη άνεση του προγραμματιστή, εμφανίζεται το Tracy, η προσωρινή μνήμη ενημερώνεται αυτόματα όταν αλλάζουν τα πρότυπα ή η διαμόρφωση του DI container, κ.λπ. Η λειτουργία παραγωγής επικεντρώνεται στην απόδοση, το Tracy καταγράφει μόνο τα σφάλματα και δεν ελέγχονται οι αλλαγές των προτύπων και άλλων αρχείων.

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

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

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

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

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

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

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

Σημειώστε ότι η τιμή `true` ενεργοποιεί τη λειτουργία προγραμματιστή με σκληρό τρόπο, κάτι που δεν πρέπει ποτέ να συμβαίνει σε έναν διακομιστή παραγωγής.


Εργαλείο εντοπισμού σφαλμάτων Tracy .[#toc-debugging-tool-tracy]
================================================================

Για εύκολη αποσφαλμάτωση, θα ενεργοποιήσουμε το σπουδαίο εργαλείο [Tracy |tracy:]. Στη λειτουργία προγραμματιστή απεικονίζει τα σφάλματα και στη λειτουργία παραγωγής καταγράφει τα σφάλματα στον καθορισμένο κατάλογο:

```php
$configurator->enableTracy($appDir . '/log');
```


Προσωρινά αρχεία .[#toc-temporary-files]
========================================

Η Nette χρησιμοποιεί την κρυφή μνήμη για το DI container, το RobotLoader, τα πρότυπα κ.λπ. Ως εκ τούτου, είναι απαραίτητο να ορίσετε τη διαδρομή προς τον κατάλογο όπου θα αποθηκεύεται η προσωρινή μνήμη:

```php
$configurator->setTempDirectory($appDir . '/temp');
```

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


RobotLoader .[#toc-robotloader]
===============================

Συνήθως, θα θέλουμε να φορτώνουμε αυτόματα τις κλάσεις χρησιμοποιώντας [τον RobotLoader |robot-loader:], οπότε πρέπει να τον εκκινήσουμε και να τον αφήσουμε να φορτώσει κλάσεις από τον κατάλογο όπου βρίσκεται το `Bootstrap.php` (δηλαδή το `__DIR__`) και όλους τους υποκαταλόγους του:

```php
$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->register();
```

Ένας εναλλακτικός τρόπος είναι να χρησιμοποιήσετε μόνο την αυτόματη φόρτωση του [Composer |best-practices:composer] PSR-4.


Χρονοζώνη .[#toc-timezone]
==========================

Το Configurator σας επιτρέπει να καθορίσετε μια ζώνη ώρας για την εφαρμογή σας.

```php
$configurator->setTimeZone('Europe/Prague');
```


Διαμόρφωση εμπορευματοκιβωτίων DI .[#toc-di-container-configuration]
====================================================================

Μέρος της διαδικασίας εκκίνησης είναι η δημιουργία ενός DI container, δηλαδή ενός εργοστασίου για αντικείμενα, το οποίο αποτελεί την καρδιά ολόκληρης της εφαρμογής. Πρόκειται στην πραγματικότητα για μια κλάση PHP που παράγεται από τη Nette και αποθηκεύεται σε έναν κατάλογο cache. Το εργοστάσιο παράγει βασικά αντικείμενα της εφαρμογής και τα αρχεία διαμόρφωσης του δίνουν οδηγίες για το πώς να τα δημιουργεί και να τα διαμορφώνει, και έτσι επηρεάζουμε τη συμπεριφορά ολόκληρης της εφαρμογής.

Τα αρχεία διαμόρφωσης γράφονται συνήθως σε [μορφή NEON |neon:format]. Μπορείτε να διαβάσετε [τι μπορεί να ρυθμιστεί εδώ |nette:configuring].

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

Τα αρχεία διαμόρφωσης φορτώνονται με τη χρήση του `addConfig()`:

```php
$configurator->addConfig($appDir . '/config/common.neon');
```

Η μέθοδος `addConfig()` μπορεί να κληθεί πολλές φορές για την προσθήκη πολλών αρχείων.

```php
$configurator->addConfig($appDir . '/config/common.neon');
$configurator->addConfig($appDir . '/config/services.neon');
if (PHP_SAPI === 'cli') {
	$configurator->addConfig($appDir . '/config/cli.php');
}
```

Το όνομα `cli.php` δεν είναι τυπογραφικό λάθος, η διαμόρφωση μπορεί επίσης να γραφτεί σε ένα αρχείο PHP, το οποίο την επιστρέφει ως πίνακα.

Εναλλακτικά, μπορούμε να χρησιμοποιήσουμε το [τμήμα`includes`  |dependency-injection:configuration#including files] για να φορτώσουμε περισσότερα αρχεία ρυθμίσεων.

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


Στατικές παράμετροι .[#toc-static-parameters]
---------------------------------------------

Οι παράμετροι που χρησιμοποιούνται σε αρχεία ρυθμίσεων μπορούν να οριστούν [στην ενότητα `parameters` |dependency-injection:configuration#parameters] και επίσης να μεταβιβαστούν (ή να αντικατασταθούν) από τη μέθοδο `addStaticParameters()` (έχει το ψευδώνυμο `addParameters()`). Είναι σημαντικό ότι διαφορετικές τιμές παραμέτρων προκαλούν τη δημιουργία πρόσθετων δοχείων DI, δηλαδή πρόσθετων κλάσεων.

```php
$configurator->addStaticParameters([
	'projectId' => 23,
]);
```

Στα αρχεία ρυθμίσεων, μπορούμε να γράψουμε τον συνήθη συμβολισμό `%projectId%` για να αποκτήσουμε πρόσβαση στην παράμετρο με το όνομα `projectId`.


Δυναμικές παράμετροι .[#toc-dynamic-parameters]
-----------------------------------------------

Μπορούμε επίσης να προσθέσουμε δυναμικές παραμέτρους στο δοχείο, οι διαφορετικές τιμές τους, σε αντίθεση με τις στατικές παραμέτρους, δεν θα προκαλέσουν τη δημιουργία νέων δοχείων DI.

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

Οι μεταβλητές περιβάλλοντος θα μπορούσαν εύκολα να γίνουν διαθέσιμες με τη χρήση δυναμικών παραμέτρων. Μπορούμε να έχουμε πρόσβαση σε αυτές μέσω της διεύθυνσης `%env.variable%` στα αρχεία ρυθμίσεων.

```php
$configurator->addDynamicParameters([
	'env' => getenv(),
]);
```


Προεπιλεγμένες παράμετροι .[#toc-default-parameters]
----------------------------------------------------

Μπορείτε να χρησιμοποιήσετε τις ακόλουθες στατικές παραμέτρους στα αρχεία διαμόρφωσης:

- `%appDir%` είναι η απόλυτη διαδρομή προς τον κατάλογο του αρχείου `Bootstrap.php`
- `%wwwDir%` είναι η απόλυτη διαδρομή προς τον κατάλογο που περιέχει το αρχείο καταχώρησης `index.php`
- `%tempDir%` είναι η απόλυτη διαδρομή προς τον κατάλογο για τα προσωρινά αρχεία
- `%vendorDir%` είναι η απόλυτη διαδρομή προς τον κατάλογο όπου ο Composer εγκαθιστά τις βιβλιοθήκες
- `%rootDir%` είναι η απόλυτη διαδρομή προς τον ριζικό κατάλογο του έργου
- Το `%debugMode%` δηλώνει αν η εφαρμογή βρίσκεται σε κατάσταση αποσφαλμάτωσης.
- Το `%consoleMode%` δηλώνει αν η αίτηση υποβλήθηκε μέσω της γραμμής εντολών.


Εισαγόμενες υπηρεσίες .[#toc-imported-services]
-----------------------------------------------

Πάμε πιο βαθιά τώρα. Παρόλο που ο σκοπός ενός DI container είναι η δημιουργία αντικειμένων, κατ' εξαίρεση μπορεί να υπάρξει ανάγκη εισαγωγής ενός υπάρχοντος αντικειμένου στο container. Αυτό το κάνουμε ορίζοντας την υπηρεσία με το χαρακτηριστικό `imported: true`.

```neon
services:
	myservice:
		type: App\Model\MyCustomService
		imported: true
```

Δημιουργούμε μια νέα περίπτωση και την εισάγουμε στο bootstrap:

```php
$configurator->addServices([
	'myservice' => new App\Model\MyCustomService('foobar'),
]);
```


Διαφορετικά περιβάλλοντα .[#toc-different-environments]
=======================================================

Μπορείτε να προσαρμόσετε την τάξη `Bootstrap` ανάλογα με τις ανάγκες σας. Μπορείτε να προσθέσετε παραμέτρους στη μέθοδο `boot()` για να διαφοροποιήσετε τα έργα ιστού ή να προσθέσετε άλλες μεθόδους, όπως η `bootForTests()`, η οποία αρχικοποιεί το περιβάλλον για δοκιμές μονάδας, η `bootForCli()` για σενάρια που καλούνται από τη γραμμή εντολών κ.ο.κ.

```php
public static function bootForTests(): Configurator
{
	$configurator = self::boot();
	Tester\Environment::setup(); // Αρχικοποίηση Nette Tester
	return $configurator;
}
```

Bootstrap

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

  • πώς να ρυθμίσετε την εφαρμογή σας χρησιμοποιώντας αρχεία NEON
  • πώς να χειρίζεστε τις λειτουργίες παραγωγής και ανάπτυξης
  • πώς να δημιουργήσετε το δοχείο DI

Οι εφαρμογές, είτε βασίζονται στο διαδίκτυο είτε σε σενάρια γραμμής εντολών, ξεκινούν με κάποια μορφή αρχικοποίησης του περιβάλλοντος. Στην αρχαιότητα, θα μπορούσε να είναι ένα αρχείο με το όνομα eg include.inc.php που ήταν υπεύθυνο γι' αυτό και συμπεριλαμβανόταν στο αρχικό αρχείο. Στις σύγχρονες εφαρμογές Nette, έχει αντικατασταθεί από την κλάση Bootstrap, η οποία ως μέρος της εφαρμογής μπορεί να βρεθεί στο app/Bootstrap.php. Μπορεί να μοιάζει για παράδειγμα ως εξής:

use Nette\Bootstrap\Configurator;

class Bootstrap
{
	public static function boot(): Configurator
	{
		$appDir = dirname(__DIR__);
		$configurator = new Configurator;
		//$configurator->setDebugMode('secret@23.75.345.200');
		$configurator->enableTracy($appDir . '/log');
		$configurator->setTempDirectory($appDir . '/temp');
		$configurator->createRobotLoader()
			->addDirectory(__DIR__)
			->register();
		$configurator->addConfig($appDir . '/config/common.neon');
		return $configurator;
	}
}

index.php

Στην περίπτωση των διαδικτυακών εφαρμογών, το αρχικό αρχείο είναι το index.php, το οποίο βρίσκεται στον δημόσιο κατάλογο www/. Επιτρέπει στην κλάση Bootstrap να αρχικοποιήσει το περιβάλλον και να επιστρέψει το $configurator που δημιουργεί το DI container. Στη συνέχεια αποκτά την υπηρεσία Application, η οποία εκτελεί την εφαρμογή ιστού:

// αρχικοποίηση του περιβάλλοντος + λήψη του αντικειμένου Configurator
$configurator = App\Bootstrap::boot();
// Δημιουργία ενός δοχείου DI
$container = $configurator->createContainer();
// Το δοχείο DI δημιουργεί ένα αντικείμενο Nette\Application\Application
$application = $container->getByType(Nette\Application\Application::class);
// έναρξη της εφαρμογής Nette
$application->run();

Όπως βλέπετε, η κλάση Nette\Bootstrap\Configurator, την οποία θα παρουσιάσουμε τώρα με περισσότερες λεπτομέρειες, βοηθάει στη ρύθμιση του περιβάλλοντος και στη δημιουργία ενός δοχείου έγχυσης εξαρτήσεων (DI).

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

Η Nette διακρίνει μεταξύ δύο βασικών τρόπων εκτέλεσης μιας αίτησης: ανάπτυξη και παραγωγή. Η λειτουργία ανάπτυξης επικεντρώνεται στη μέγιστη άνεση του προγραμματιστή, εμφανίζεται το Tracy, η προσωρινή μνήμη ενημερώνεται αυτόματα όταν αλλάζουν τα πρότυπα ή η διαμόρφωση του DI container, κ.λπ. Η λειτουργία παραγωγής επικεντρώνεται στην απόδοση, το Tracy καταγράφει μόνο τα σφάλματα και δεν ελέγχονται οι αλλαγές των προτύπων και άλλων αρχείων.

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

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

$configurator->setDebugMode('23.75.345.200'); // μία ή περισσότερες διευθύνσεις IP

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

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

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

$configurator->setDebugMode(false);

Σημειώστε ότι η τιμή true ενεργοποιεί τη λειτουργία προγραμματιστή με σκληρό τρόπο, κάτι που δεν πρέπει ποτέ να συμβαίνει σε έναν διακομιστή παραγωγής.

Εργαλείο εντοπισμού σφαλμάτων Tracy

Για εύκολη αποσφαλμάτωση, θα ενεργοποιήσουμε το σπουδαίο εργαλείο Tracy. Στη λειτουργία προγραμματιστή απεικονίζει τα σφάλματα και στη λειτουργία παραγωγής καταγράφει τα σφάλματα στον καθορισμένο κατάλογο:

$configurator->enableTracy($appDir . '/log');

Προσωρινά αρχεία

Η Nette χρησιμοποιεί την κρυφή μνήμη για το DI container, το RobotLoader, τα πρότυπα κ.λπ. Ως εκ τούτου, είναι απαραίτητο να ορίσετε τη διαδρομή προς τον κατάλογο όπου θα αποθηκεύεται η προσωρινή μνήμη:

$configurator->setTempDirectory($appDir . '/temp');

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

RobotLoader

Συνήθως, θα θέλουμε να φορτώνουμε αυτόματα τις κλάσεις χρησιμοποιώντας τον RobotLoader, οπότε πρέπει να τον εκκινήσουμε και να τον αφήσουμε να φορτώσει κλάσεις από τον κατάλογο όπου βρίσκεται το Bootstrap.php (δηλαδή το __DIR__) και όλους τους υποκαταλόγους του:

$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->register();

Ένας εναλλακτικός τρόπος είναι να χρησιμοποιήσετε μόνο την αυτόματη φόρτωση του Composer PSR-4.

Χρονοζώνη

Το Configurator σας επιτρέπει να καθορίσετε μια ζώνη ώρας για την εφαρμογή σας.

$configurator->setTimeZone('Europe/Prague');

Διαμόρφωση εμπορευματοκιβωτίων DI

Μέρος της διαδικασίας εκκίνησης είναι η δημιουργία ενός DI container, δηλαδή ενός εργοστασίου για αντικείμενα, το οποίο αποτελεί την καρδιά ολόκληρης της εφαρμογής. Πρόκειται στην πραγματικότητα για μια κλάση PHP που παράγεται από τη Nette και αποθηκεύεται σε έναν κατάλογο cache. Το εργοστάσιο παράγει βασικά αντικείμενα της εφαρμογής και τα αρχεία διαμόρφωσης του δίνουν οδηγίες για το πώς να τα δημιουργεί και να τα διαμορφώνει, και έτσι επηρεάζουμε τη συμπεριφορά ολόκληρης της εφαρμογής.

Τα αρχεία διαμόρφωσης γράφονται συνήθως σε μορφή NEON. Μπορείτε να διαβάσετε τι μπορεί να ρυθμιστεί εδώ.

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

Τα αρχεία διαμόρφωσης φορτώνονται με τη χρήση του addConfig():

$configurator->addConfig($appDir . '/config/common.neon');

Η μέθοδος addConfig() μπορεί να κληθεί πολλές φορές για την προσθήκη πολλών αρχείων.

$configurator->addConfig($appDir . '/config/common.neon');
$configurator->addConfig($appDir . '/config/services.neon');
if (PHP_SAPI === 'cli') {
	$configurator->addConfig($appDir . '/config/cli.php');
}

Το όνομα cli.php δεν είναι τυπογραφικό λάθος, η διαμόρφωση μπορεί επίσης να γραφτεί σε ένα αρχείο PHP, το οποίο την επιστρέφει ως πίνακα.

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

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

Στατικές παράμετροι

Οι παράμετροι που χρησιμοποιούνται σε αρχεία ρυθμίσεων μπορούν να οριστούν στην ενότητα parameters και επίσης να μεταβιβαστούν (ή να αντικατασταθούν) από τη μέθοδο addStaticParameters() (έχει το ψευδώνυμο addParameters()). Είναι σημαντικό ότι διαφορετικές τιμές παραμέτρων προκαλούν τη δημιουργία πρόσθετων δοχείων DI, δηλαδή πρόσθετων κλάσεων.

$configurator->addStaticParameters([
	'projectId' => 23,
]);

Στα αρχεία ρυθμίσεων, μπορούμε να γράψουμε τον συνήθη συμβολισμό %projectId% για να αποκτήσουμε πρόσβαση στην παράμετρο με το όνομα projectId.

Δυναμικές παράμετροι

Μπορούμε επίσης να προσθέσουμε δυναμικές παραμέτρους στο δοχείο, οι διαφορετικές τιμές τους, σε αντίθεση με τις στατικές παραμέτρους, δεν θα προκαλέσουν τη δημιουργία νέων δοχείων DI.

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

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

$configurator->addDynamicParameters([
	'env' => getenv(),
]);

Προεπιλεγμένες παράμετροι

Μπορείτε να χρησιμοποιήσετε τις ακόλουθες στατικές παραμέτρους στα αρχεία διαμόρφωσης:

  • %appDir% είναι η απόλυτη διαδρομή προς τον κατάλογο του αρχείου Bootstrap.php
  • %wwwDir% είναι η απόλυτη διαδρομή προς τον κατάλογο που περιέχει το αρχείο καταχώρησης index.php
  • %tempDir% είναι η απόλυτη διαδρομή προς τον κατάλογο για τα προσωρινά αρχεία
  • %vendorDir% είναι η απόλυτη διαδρομή προς τον κατάλογο όπου ο Composer εγκαθιστά τις βιβλιοθήκες
  • %rootDir% είναι η απόλυτη διαδρομή προς τον ριζικό κατάλογο του έργου
  • Το %debugMode% δηλώνει αν η εφαρμογή βρίσκεται σε κατάσταση αποσφαλμάτωσης.
  • Το %consoleMode% δηλώνει αν η αίτηση υποβλήθηκε μέσω της γραμμής εντολών.

Εισαγόμενες υπηρεσίες

Πάμε πιο βαθιά τώρα. Παρόλο που ο σκοπός ενός DI container είναι η δημιουργία αντικειμένων, κατ' εξαίρεση μπορεί να υπάρξει ανάγκη εισαγωγής ενός υπάρχοντος αντικειμένου στο container. Αυτό το κάνουμε ορίζοντας την υπηρεσία με το χαρακτηριστικό imported: true.

services:
	myservice:
		type: App\Model\MyCustomService
		imported: true

Δημιουργούμε μια νέα περίπτωση και την εισάγουμε στο bootstrap:

$configurator->addServices([
	'myservice' => new App\Model\MyCustomService('foobar'),
]);

Διαφορετικά περιβάλλοντα

Μπορείτε να προσαρμόσετε την τάξη Bootstrap ανάλογα με τις ανάγκες σας. Μπορείτε να προσθέσετε παραμέτρους στη μέθοδο boot() για να διαφοροποιήσετε τα έργα ιστού ή να προσθέσετε άλλες μεθόδους, όπως η bootForTests(), η οποία αρχικοποιεί το περιβάλλον για δοκιμές μονάδας, η bootForCli() για σενάρια που καλούνται από τη γραμμή εντολών κ.ο.κ.

public static function bootForTests(): Configurator
{
	$configurator = self::boot();
	Tester\Environment::setup(); // Αρχικοποίηση Nette Tester
	return $configurator;
}