From 6c64b1f6d578391b9046e14c4a3c68a52fcadbb5 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Thu, 24 Oct 2024 02:52:08 +0200 Subject: [PATCH] new Bootstrap API --- application/bg/bootstrap.texy | 106 ++++++++++++++++++++++------------ application/cs/bootstrap.texy | 102 +++++++++++++++++++++----------- application/de/bootstrap.texy | 106 ++++++++++++++++++++++------------ application/el/bootstrap.texy | 102 +++++++++++++++++++++----------- application/en/bootstrap.texy | 102 +++++++++++++++++++++----------- application/es/bootstrap.texy | 106 ++++++++++++++++++++++------------ application/fr/bootstrap.texy | 104 ++++++++++++++++++++++----------- application/hu/bootstrap.texy | 102 +++++++++++++++++++++----------- application/it/bootstrap.texy | 106 ++++++++++++++++++++++------------ application/pl/bootstrap.texy | 106 ++++++++++++++++++++++------------ application/pt/bootstrap.texy | 106 ++++++++++++++++++++++------------ application/ro/bootstrap.texy | 104 ++++++++++++++++++++++----------- application/ru/bootstrap.texy | 106 ++++++++++++++++++++++------------ application/sl/bootstrap.texy | 102 +++++++++++++++++++++----------- application/tr/bootstrap.texy | 106 ++++++++++++++++++++++------------ application/uk/bootstrap.texy | 106 ++++++++++++++++++++++------------ quickstart/bg/@home.texy | 3 +- quickstart/cs/@home.texy | 3 +- quickstart/de/@home.texy | 3 +- quickstart/el/@home.texy | 3 +- quickstart/en/@home.texy | 3 +- quickstart/es/@home.texy | 3 +- quickstart/fr/@home.texy | 3 +- quickstart/hu/@home.texy | 3 +- quickstart/it/@home.texy | 3 +- quickstart/pl/@home.texy | 3 +- quickstart/pt/@home.texy | 3 +- quickstart/ro/@home.texy | 3 +- quickstart/ru/@home.texy | 3 +- quickstart/sl/@home.texy | 3 +- quickstart/tr/@home.texy | 3 +- quickstart/uk/@home.texy | 3 +- 32 files changed, 1124 insertions(+), 596 deletions(-) diff --git a/application/bg/bootstrap.texy b/application/bg/bootstrap.texy index c2cd01ec7e..2ac3dc2e99 100644 --- a/application/bg/bootstrap.texy +++ b/application/bg/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Конфигураторът отговаря за настройката на средата на приложението и услугите. + $this->configurator = new Configurator; + // Задайте директорията за временни файлове, генерирани от Nette (напр. компилирани шаблони) + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette е интелигентен и режимът за разработка се включва автоматично, + // или можете да го включите за определен IP адрес, като разкоментирате следния ред: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Активира Tracy: най-добрият инструмент за отстраняване на грешки "швейцарско ножче". + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: автоматично зарежда всички класове в дадената директория + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Зареждане на конфигурационни файлове + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -В случая на уеб приложения началният файл е `index.php`, който се намира в публичната директория `www/`. Той позволява на класа `Bootstrap` да инициализира средата и връща `$configurator`, който създава контейнера DI. След това тя извлича услугата `Application`, която стартира уеб приложението: +Началният файл за уеб приложенията е `index.php`, разположен в публичната директория `www/`. Той използва класа `Bootstrap` за инициализиране на средата и създаване на контейнер DI. След това получава услугата `Application` от контейнера, която стартира уеб приложението: ```php -// инициализиране на средата + получаване на обект Configurator -$configurator = App\Bootstrap::boot(); -// създаване на DI-контейнер -$container = $configurator->createContainer(); -// DI-контейнерът ще създаде обект Nette\Application\Application +$bootstrap = new App\Bootstrap; +// Иницииране на средата + създаване на контейнер DI +$container = $bootstrap->bootWebApplication(); +// Контейнерът DI създава обект Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -//стартиране на приложението Nette +// Стартирайте приложението Nette и обработете входящата заявка $application->run(); ``` @@ -66,19 +91,19 @@ Nette прави разграничение между два основни р Ако искате да активирате режима за разработка в други случаи, например за програмисти, които имат достъп от определен IP адрес, можете да използвате `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // един или повече IP адреси +$this->configurator->setDebugMode('23.75.345.200'); // един или повече IP адреси ``` Определено препоръчваме да комбинирате IP адреса с "бисквитка". Ще съхраним тайния токен в "бисквитката" `nette-debug', например, `secret1234`, а режимът за разработка ще бъде активиран за програмистите с тази комбинация от IP и "бисквитка". ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Можете да деактивирате напълно режима за разработчици, дори за localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Обърнете внимание, че стойността `true` активира плътно режима за разработчици, което никога не трябва да се случва на производствен сървър. @@ -90,7 +115,7 @@ $configurator->setDebugMode(false); За да улесним дебъгването, ще включим чудесния инструмент [Tracy |tracy:]. В режим за разработчици той визуализира грешките, а в производствен режим записва грешките в определена директория: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ $configurator->enableTracy($rootDir . '/log'); Nette използва кеш за DI-контейнер, RobotLoader, шаблони и др. Затова е необходимо да се зададе пътят до директорията, в която се съхранява кешът: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` В Linux или macOS задайте [разрешения за запис |nette:troubleshooting#Setting-Directory-Permissions] за директориите `log/` и `temp/`. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Обикновено искаме да заредим класовете автоматично с помощта на [RobotLoader |robot-loader:], така че трябва да го стартираме и да му позволим да зареди класовете от директорията, в която се намира `Bootstrap.php` (т.е. `__DIR__`) и всички негови поддиректории: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ $configurator->createRobotLoader() Конфигураторът ви позволява да зададете часовата зона за вашето приложение. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ $configurator->setTimeZone('Europe/Prague'); Файловете за конфигурация се зареждат с помощта на `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Методът `addConfig()` може да се извика няколко пъти, за да се добавят няколко файла. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ if (PHP_SAPI === 'cli') { Параметрите, използвани в конфигурационните файлове, могат да бъдат дефинирани [в раздела `parameters` |dependency-injection:configuration#parameters] и да бъдат взети (или презаписани) от метода `addStaticParameters()` (той има псевдоним `addParameters()`). Важно е, че различните стойности на параметрите водят до генериране на допълнителни DI-контейнери, т.е. допълнителни класове. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ $configurator->addStaticParameters([ Възможно е също така да се добавят динамични параметри към контейнер. Различните им стойности, за разлика от статичните параметри, не генерират нови контейнери DI. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Достъпът до променливите на средата е лесен с помощта на динамични параметри. Достъпът до тях се осъществява чрез `%env.variable%` в конфигурационните файлове. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Създайте нов екземпляр и го вмъкнете в Bootstrap: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Различни среди .[#toc-different-environments] ============================================= -Не се колебайте да персонализирате класа `Bootstrap` според нуждите си. Можете да добавите параметри към метода `boot()`, за да разделите уеб проектите, или да добавите други методи, като например `bootForTests()`, който инициализира средата за тестове на единици, `bootForCli()` за скриптове, извикани от командния ред, и т.н. +Не се колебайте да персонализирате класа `Bootstrap` според нуждите си. Можете да добавите параметри към метода `bootWebApplication()`, за да разграничите отделните уеб проекти. Като алтернатива можете да добавите и други методи, например `bootTestEnvironment()` за инициализиране на средата за unit тестове, `bootConsoleApplication()` за скриптове, извикани от командния ред, и т.н. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container +{ + Tester\Environment::setup(); // Инициализация на Nette Tester + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container { - $configurator = self::boot(); - Tester\Environment::setup(); // Инициализация Nette Tester - return $configurator; + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/cs/bootstrap.texy b/application/cs/bootstrap.texy index 7ed9569e3c..6357fe0d4d 100644 --- a/application/cs/bootstrap.texy +++ b/application/cs/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Konfigurátor je zodpovědný za nastavení prostředí aplikace a služeb. + $this->configurator = new Configurator; + // Nastaví adresář pro dočasné soubory generované Nette (např. zkompilované šablony) + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette je chytré a vývojový režim se zapíná automaticky, + // nebo jej můžete povolit pro konkrétní IP adresu odkomentováním následujícího řádku: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Aktivuje Tracy: ultimátní "švýcarský nůž" pro ladění. + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: automaticky načítá všechny třídy ve zvoleném adresáři + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Načte konfigurační soubory + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php ========= -Prvotní soubor je v případě webových aplikací `index.php`, který se nachází ve veřejném adresáři `www/`. Ten si nechá od třídy Bootstrap inicializovat prostředí a vrátit `$configurator` a následně vyrobí DI kontejner. Poté z něj získá službu `Application`, kterou spustí webovou aplikaci: +Prvotní soubor je v případě webových aplikací `index.php`, který se nachází ve veřejném adresáři `www/`. Ten si nechá od třídy Bootstrap inicializovat prostředí a vyrobit DI kontejner. Poté z něj získá službu `Application`, která spustí webovou aplikaci: ```php -// inicializace prostředí + získání objektu Configurator -$configurator = App\Bootstrap::boot(); -// vytvoření DI kontejneru -$container = $configurator->createContainer(); +$bootstrap = new App\Bootstrap; +// Inicializace prostředí + vytvoření DI kontejneru +$container = $bootstrap->bootWebApplication(); // DI kontejner vytvoří objekt Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -// spuštění Nette aplikace +// Spuštění aplikace Nette a zpracování příchozího požadavku $application->run(); ``` @@ -66,19 +91,19 @@ Volba režimu se provádí autodetekcí, takže obvykle není potřeba nic konfi Pokud chceme vývojářský režim povolit i v dalších případech, například programátorům přistupujícím z konkrétní IP adresy, použijeme `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // lze uvést i pole IP adres +$this->configurator->setDebugMode('23.75.345.200'); // lze uvést i pole IP adres ``` Rozhodně doporučujeme kombinovat IP adresu s cookie. Do cookie `nette-debug` uložíme tajný token, např. `secret1234`, a tímto způsobem aktivujeme vývojářský režim pro programátory přistupující z konkrétní IP adresy a zároveň mající v cookie zmíněný token: ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Vývojářský režim můžeme také vypnout úplně, i pro localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Pozor, hodnota `true` zapne vývojářský režim natvrdo, což se nikdy nesmí stát na produkčním serveru. @@ -90,7 +115,7 @@ Debugovací nástroj Tracy Pro snadné debugování ještě zapneme skvělý nástroj [Tracy |tracy:]. Ve vývojářském režimu chyby vizualizuje a v produkčním režimu chyby loguje do uvedeného adresáře: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Dočasné soubory Nette využívá cache pro DI kontejner, RobotLoader, šablony atd. Proto je nutné nastavit cestu k adresáři, kam se bude cache ukládat: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` Na Linuxu nebo macOS nastavte adresářům `log/` a `temp/` [práva pro zápis |nette:troubleshooting#Nastavení práv adresářů]. @@ -112,7 +137,7 @@ RobotLoader Zpravidla budeme chtít automaticky načítat třídy pomocí [RobotLoaderu |robot-loader:], musíme ho tedy nastartovat a necháme jej načítat třídy z adresáře, kde je umístěný `Bootstrap.php` (tj. `__DIR__`), a všech podadresářů: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Timezone Přes konfigurátor můžete nastavit výchozí časovou zónu. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ Ve vývojářském režimu se kontejner automaticky aktualizuje při každé zm Konfigurační soubory načteme pomocí `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Pokud chceme přidat více konfiguračních souborů, můžeme funkci `addConfig()` zavolat vícekrát. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Statické parametry Parametry používané v konfiguračních souborech můžeme definovat [v sekci `parameters`|dependency-injection:configuration#parametry] a také je předávat (či přepisovat) metodou `addStaticParameters()` (má alias `addParameters()`). Důležité je, že různé hodnoty parametrů způsobí vygenerování dalších DI kontejnerů, tedy dalších tříd. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Dynamické parametry Do kontejneru můžeme přidat i dynamické parametry, jejichž různé hodnoty na rozdíl od statických parameterů nezpůsobí generování nových DI kontejnerů. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Jednoduše tak můžeme přidat např. environmentální proměnné, na které se pak lze v konfiguraci odkázat zápisem `%env.variable%`. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: A v bootstrapu do kontejneru vložíme objekt: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Odlišné prostředí ================= -Nebojte se upravit třídu Bootstrap podle svých potřeb. Metodě `boot()` můžete přidat parametry pro rozlišení webových projektů nebo doplnit další metody, například `bootForTests()`, která inicializuje prostředí pro jednotkové testy, `bootForCli()` pro skripty volané z příkazové řádky atd. +Nebojte se upravit třídu Bootstrap podle svých potřeb. Metodě `bootWebApplication()` můžete přidat parametry pro rozlišení webových projektů. Nebo můžeme doplnit další metody, například `bootTestEnvironment()`, která inicializuje prostředí pro jednotkové testy, `bootConsoleApplication()` pro skripty volané z příkazové řádky atd. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container { - $configurator = self::boot(); Tester\Environment::setup(); // inicializace Nette Testeru - return $configurator; + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container +{ + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/de/bootstrap.texy b/application/de/bootstrap.texy index 6b1fa8f7e6..6c441bfcf9 100644 --- a/application/de/bootstrap.texy +++ b/application/de/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Der Konfigurator ist für das Einrichten der Anwendungsumgebung und der Dienste zuständig. + $this->configurator = new Configurator; + // Legen Sie das Verzeichnis für temporäre Dateien fest, die von Nette erzeugt werden (z. B. kompilierte Vorlagen) + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette ist intelligent, und der Entwicklungsmodus wird automatisch aktiviert, + // oder Sie können ihn für eine bestimmte IP-Adresse aktivieren, indem Sie die folgende Zeile auskommentieren: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Aktiviert Tracy: das ultimative "Schweizer Taschenmesser" zur Fehlersuche. + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: Lädt automatisch alle Klassen im angegebenen Verzeichnis + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Konfigurationsdateien laden + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -Im Falle von Webanwendungen ist die Ausgangsdatei `index.php`, die sich im öffentlichen Verzeichnis `www/` befindet. Sie überlässt es der Klasse `Bootstrap`, die Umgebung zu initialisieren und den `$configurator` zurückzugeben, der den DI-Container erstellt. Dann wird der Dienst `Application` aufgerufen, der die Webanwendung ausführt: +Die Ausgangsdatei für Webanwendungen ist `index.php`, die sich im öffentlichen Verzeichnis `www/` befindet. Sie verwendet die Klasse `Bootstrap`, um die Umgebung zu initialisieren und einen DI-Container zu erstellen. Anschließend wird der Dienst `Application` aus dem Container abgerufen, der die Webanwendung startet: ```php -// Initialisieren der Umgebung + Abrufen des Configurator-Objekts -$configurator = App\Bootstrap::boot(); -// Erstellen eines DI-Containers -$container = $configurator->createContainer(); -// DI-Container erstellt ein Nette\Application\Application-Objekt +$bootstrap = new App\Bootstrap; +// Initialisierung der Umgebung + Erstellung eines DI-Containers +$container = $bootstrap->bootWebApplication(); +// DI-Container erstellt ein Nette\Anwendung\Anwendungsobjekt $application = $container->getByType(Nette\Application\Application::class); -// Nette-Anwendung starten +// Starten Sie die Nette-Anwendung und bearbeiten Sie die eingehende Anfrage $application->run(); ``` @@ -66,19 +91,19 @@ Die Auswahl des Modus erfolgt durch automatische Erkennung, so dass in der Regel Wenn Sie den Entwicklungsmodus in anderen Fällen aktivieren möchten, z. B. für Programmierer, die von einer bestimmten IP-Adresse aus zugreifen, können Sie `setDebugMode()` verwenden: ```php -$configurator->setDebugMode('23.75.345.200'); // eine oder mehrere IP-Adressen +$this->configurator->setDebugMode('23.75.345.200'); // eine oder mehrere IP-Adressen ``` Wir empfehlen auf jeden Fall, eine IP-Adresse mit einem Cookie zu kombinieren. Wir speichern ein geheimes Token im `nette-debug` Cookie, z.B. `secret1234`, und der Entwicklungsmodus wird für Programmierer mit dieser Kombination von IP und Cookie aktiviert. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Wir können den Entwicklermodus auch komplett abschalten, sogar für localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Beachten Sie, dass der Wert `true` den Entwicklermodus standardmäßig einschaltet, was auf einem Produktionsserver niemals passieren sollte. @@ -90,7 +115,7 @@ Debugging-Werkzeug Tracy .[#toc-debugging-tool-tracy] Zur einfachen Fehlersuche werden wir das großartige Tool [Tracy |tracy:] einschalten. Im Entwicklermodus zeigt es Fehler an und im Produktionsmodus protokolliert es Fehler in das angegebene Verzeichnis: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Temporäre Dateien .[#toc-temporary-files] Nette verwendet den Cache für DI-Container, RobotLoader, Vorlagen usw. Daher ist es notwendig, den Pfad zu dem Verzeichnis festzulegen, in dem der Cache gespeichert werden soll: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` Unter Linux oder macOS setzen Sie die [Schreibrechte |nette:troubleshooting#Setting directory permissions] für die Verzeichnisse `log/` und `temp/`. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Normalerweise wollen wir die Klassen automatisch mit [RobotLoader |robot-loader:] laden, also müssen wir ihn starten und ihn Klassen aus dem Verzeichnis laden lassen, in dem sich `Bootstrap.php` befindet (d.h. `__DIR__`) und aus allen seinen Unterverzeichnissen: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Zeitzone .[#toc-timezone] Configurator ermöglicht es Ihnen, eine Zeitzone für Ihre Anwendung festzulegen. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ Im Entwicklungsmodus wird der Container jedes Mal automatisch aktualisiert, wenn Konfigurationsdateien werden mit `addConfig()` geladen: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Die Methode `addConfig()` kann mehrfach aufgerufen werden, um mehrere Dateien hinzuzufügen. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Statische Parameter .[#toc-static-parameters] Parameter, die in Konfigurationsdateien verwendet werden, können [im Abschnitt `parameters` |dependency-injection:configuration#parameters] definiert und auch von der Methode `addStaticParameters()` übergeben (oder überschrieben) werden (sie hat den Alias `addParameters()`). Wichtig ist, dass unterschiedliche Parameterwerte die Erzeugung zusätzlicher DI-Container, d.h. zusätzlicher Klassen, bewirken. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Dynamische Parameter .[#toc-dynamic-parameters] Wir können dem Container auch dynamische Parameter hinzufügen, deren unterschiedliche Werte, im Gegensatz zu statischen Parametern, nicht die Erzeugung neuer DI-Container verursachen. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Umgebungsvariablen können mit dynamischen Parametern leicht verfügbar gemacht werden. Wir können über `%env.variable%` in Konfigurationsdateien auf sie zugreifen. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Erstellen Sie eine neue Instanz und fügen Sie sie in Bootstrap ein: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Verschiedene Umgebungen .[#toc-different-environments] ====================================================== -Es steht Ihnen frei, die Klasse `Bootstrap` an Ihre Bedürfnisse anzupassen. Sie können der Methode `boot()` Parameter hinzufügen, um Webprojekte zu unterscheiden, oder andere Methoden hinzufügen, wie `bootForTests()`, die die Umgebung für Unit-Tests initialisiert, `bootForCli()` für Skripte, die von der Befehlszeile aus aufgerufen werden, und so weiter. +Zögern Sie nicht, die Klasse `Bootstrap` nach Ihren Bedürfnissen anzupassen. Sie können der Methode `bootWebApplication()` Parameter hinzufügen, um zwischen Webprojekten zu unterscheiden. Alternativ können Sie auch andere Methoden hinzufügen, z. B. `bootTestEnvironment()`, um die Umgebung für Unit-Tests zu initialisieren, `bootConsoleApplication()` für Skripte, die von der Befehlszeile aus aufgerufen werden, und so weiter. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container +{ + Tester\Environment::setup(); // Initialisierung des Nette-Testers + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container { - $configurator = self::boot(); - Tester\Environment::setup(); // Nette Tester Initialisierung - return $configurator; + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/el/bootstrap.texy b/application/el/bootstrap.texy index 91cc3f41db..f71018bac5 100644 --- a/application/el/bootstrap.texy +++ b/application/el/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Ο διαμορφωτής είναι υπεύθυνος για τη ρύθμιση του περιβάλλοντος και των υπηρεσιών της εφαρμογής. + $this->configurator = new Configurator; + // Ορίστε τον κατάλογο για τα προσωρινά αρχεία που παράγονται από τη Nette (π.χ. μεταγλωττισμένα πρότυπα) + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Η Nette είναι έξυπνη και η λειτουργία ανάπτυξης ενεργοποιείται αυτόματα, + // ή μπορείτε να την ενεργοποιήσετε για μια συγκεκριμένη διεύθυνση IP ξεσχολιάζοντας την ακόλουθη γραμμή: + // $this->configurator->setDebugMode('secret@23.75.345.200'), + + // Ενεργοποιεί το Tracy: το απόλυτο εργαλείο αποσφαλμάτωσης "ελβετικό μαχαίρι του στρατού". + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: αυτόματη φόρτωση όλων των κλάσεων στον δεδομένο κατάλογο + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Φόρτωση αρχείων διαμόρφωσης + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -Στην περίπτωση των διαδικτυακών εφαρμογών, το αρχικό αρχείο είναι το `index.php`, το οποίο βρίσκεται στον δημόσιο κατάλογο `www/`. Επιτρέπει στην κλάση `Bootstrap` να αρχικοποιήσει το περιβάλλον και να επιστρέψει το `$configurator` που δημιουργεί το DI container. Στη συνέχεια αποκτά την υπηρεσία `Application`, η οποία εκτελεί την εφαρμογή ιστού: +Το αρχικό αρχείο για τις διαδικτυακές εφαρμογές είναι το `index.php`, το οποίο βρίσκεται στον δημόσιο κατάλογο `www/`. Χρησιμοποιεί την κλάση `Bootstrap` για την αρχικοποίηση του περιβάλλοντος και τη δημιουργία ενός δοχείου DI. Στη συνέχεια, λαμβάνει την υπηρεσία `Application` από το δοχείο, η οποία εκκινεί την εφαρμογή ιστού: ```php -// αρχικοποίηση του περιβάλλοντος + λήψη του αντικειμένου Configurator -$configurator = App\Bootstrap::boot(); -// Δημιουργία ενός δοχείου DI -$container = $configurator->createContainer(); +$bootstrap = new App\Bootstrap; +// Αρχικοποίηση του περιβάλλοντος + δημιουργία ενός δοχείου DI +$container = $bootstrap->bootWebApplication(); // Το δοχείο DI δημιουργεί ένα αντικείμενο Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -// έναρξη της εφαρμογής Nette +// Εκκίνηση της εφαρμογής Nette και χειρισμός της εισερχόμενης αίτησης $application->run(); ``` @@ -66,19 +91,19 @@ $application->run(); Αν θέλετε να ενεργοποιήσετε τη λειτουργία ανάπτυξης σε άλλες περιπτώσεις, για παράδειγμα, για προγραμματιστές που έχουν πρόσβαση από μια συγκεκριμένη διεύθυνση IP, μπορείτε να χρησιμοποιήσετε τη διεύθυνση `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // μία ή περισσότερες διευθύνσεις IP +$this->configurator->setDebugMode('23.75.345.200'); // μία ή περισσότερες διευθύνσεις IP ``` Συνιστούμε οπωσδήποτε τον συνδυασμό μιας διεύθυνσης IP με ένα cookie. Θα αποθηκεύσουμε ένα μυστικό token στο cookie `nette-debug`, π.χ. `secret1234`, και η λειτουργία ανάπτυξης θα ενεργοποιηθεί για τους προγραμματιστές με αυτόν τον συνδυασμό IP και cookie. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Μπορούμε επίσης να απενεργοποιήσουμε εντελώς τη λειτουργία προγραμματιστή, ακόμη και για το localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Σημειώστε ότι η τιμή `true` ενεργοποιεί τη λειτουργία προγραμματιστή με σκληρό τρόπο, κάτι που δεν πρέπει ποτέ να συμβαίνει σε έναν διακομιστή παραγωγής. @@ -90,7 +115,7 @@ $configurator->setDebugMode(false); Για εύκολη αποσφαλμάτωση, θα ενεργοποιήσουμε το σπουδαίο εργαλείο [Tracy |tracy:]. Στη λειτουργία προγραμματιστή απεικονίζει τα σφάλματα και στη λειτουργία παραγωγής καταγράφει τα σφάλματα στον καθορισμένο κατάλογο: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ $configurator->enableTracy($rootDir . '/log'); Η Nette χρησιμοποιεί την κρυφή μνήμη για το DI container, το RobotLoader, τα πρότυπα κ.λπ. Ως εκ τούτου, είναι απαραίτητο να ορίσετε τη διαδρομή προς τον κατάλογο όπου θα αποθηκεύεται η προσωρινή μνήμη: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` Σε Linux ή macOS, ορίστε τα [δικαιώματα εγγραφής |nette:troubleshooting#Setting directory permissions] για τους καταλόγους `log/` και `temp/`. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Συνήθως, θα θέλουμε να φορτώνουμε αυτόματα τις κλάσεις χρησιμοποιώντας [τον RobotLoader |robot-loader:], οπότε πρέπει να τον εκκινήσουμε και να τον αφήσουμε να φορτώσει κλάσεις από τον κατάλογο όπου βρίσκεται το `Bootstrap.php` (δηλαδή το `__DIR__`) και όλους τους υποκαταλόγους του: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ $configurator->createRobotLoader() Το Configurator σας επιτρέπει να καθορίσετε μια ζώνη ώρας για την εφαρμογή σας. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ $configurator->setTimeZone('Europe/Prague'); Τα αρχεία διαμόρφωσης φορτώνονται με τη χρήση του `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Η μέθοδος `addConfig()` μπορεί να κληθεί πολλές φορές για την προσθήκη πολλών αρχείων. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ if (PHP_SAPI === 'cli') { Οι παράμετροι που χρησιμοποιούνται σε αρχεία ρυθμίσεων μπορούν να οριστούν [στην ενότητα `parameters` |dependency-injection:configuration#parameters] και επίσης να μεταβιβαστούν (ή να αντικατασταθούν) από τη μέθοδο `addStaticParameters()` (έχει το ψευδώνυμο `addParameters()`). Είναι σημαντικό ότι διαφορετικές τιμές παραμέτρων προκαλούν τη δημιουργία πρόσθετων δοχείων DI, δηλαδή πρόσθετων κλάσεων. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ $configurator->addStaticParameters([ Μπορούμε επίσης να προσθέσουμε δυναμικές παραμέτρους στο δοχείο, οι διαφορετικές τιμές τους, σε αντίθεση με τις στατικές παραμέτρους, δεν θα προκαλέσουν τη δημιουργία νέων δοχείων DI. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Οι μεταβλητές περιβάλλοντος θα μπορούσαν εύκολα να γίνουν διαθέσιμες με τη χρήση δυναμικών παραμέτρων. Μπορούμε να έχουμε πρόσβαση σε αυτές μέσω της διεύθυνσης `%env.variable%` στα αρχεία ρυθμίσεων. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Δημιουργούμε μια νέα περίπτωση και την εισάγουμε στο bootstrap: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Διαφορετικά περιβάλλοντα .[#toc-different-environments] ======================================================= -Μπορείτε να προσαρμόσετε την τάξη `Bootstrap` ανάλογα με τις ανάγκες σας. Μπορείτε να προσθέσετε παραμέτρους στη μέθοδο `boot()` για να διαφοροποιήσετε τα έργα ιστού ή να προσθέσετε άλλες μεθόδους, όπως η `bootForTests()`, η οποία αρχικοποιεί το περιβάλλον για δοκιμές μονάδας, η `bootForCli()` για σενάρια που καλούνται από τη γραμμή εντολών κ.ο.κ. +Μη διστάσετε να προσαρμόσετε την τάξη `Bootstrap` σύμφωνα με τις ανάγκες σας. Μπορείτε να προσθέσετε παραμέτρους στη μέθοδο `bootWebApplication()` για να διαφοροποιήσετε τα διάφορα web projects. Εναλλακτικά, μπορείτε να προσθέσετε άλλες μεθόδους, όπως `bootTestEnvironment()` για την αρχικοποίηση του περιβάλλοντος για δοκιμές μονάδας, `bootConsoleApplication()` για σενάρια που καλούνται από τη γραμμή εντολών κ.ο.κ. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container { - $configurator = self::boot(); Tester\Environment::setup(); // Αρχικοποίηση Nette Tester - return $configurator; + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container +{ + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/en/bootstrap.texy b/application/en/bootstrap.texy index f0b54d49b9..a950df1e88 100644 --- a/application/en/bootstrap.texy +++ b/application/en/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // The configurator is responsible for setting up the application environment and services. + $this->configurator = new Configurator; + // Set the directory for temporary files generated by Nette (e.g. compiled templates) + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette is smart, and the development mode turns on automatically, + // or you can enable for a specific IP address it by uncommenting the following line: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Enables Tracy: the ultimate "swiss army knife" debugging tool. + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: autoloads all classes in the given directory + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Load configuration files + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php ========= -In the case of web applications, the initial file is `index.php`, which is located in the public directory `www/`. It lets the `Bootstrap` class to initialize the environment and return the `$configurator` which creates DI container. Then it obtains the `Application` service, that runs the web application: +The initial file for web applications is `index.php`, located in the public directory `www/`. It uses the `Bootstrap` class to initialize the environment and create a DI container. Then, it obtains the `Application` service from the container, which launches the web application: ```php -// initialize the environment + get Configurator object -$configurator = App\Bootstrap::boot(); -// create a DI container -$container = $configurator->createContainer(); +$bootstrap = new App\Bootstrap; +// Initialize the environment + create a DI container +$container = $bootstrap->bootWebApplication(); // DI container creates a Nette\Application\Application object $application = $container->getByType(Nette\Application\Application::class); -// start Nette application +// Start the Nette application and handle the incoming request $application->run(); ``` @@ -66,19 +91,19 @@ Mode selection is done by autodetection, so there is usually no need to configur If you want to enable development mode in other cases, for example, for programmers accessing from a specific IP address, you can use `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // one or more IP addresses +$this->configurator->setDebugMode('23.75.345.200'); // one or more IP addresses ``` We definitely recommend combining an IP address with a cookie. We will store a secret token into the `nette-debug` cookie, e.g. `secret1234`, and the development mode will be activated for programmers with this combination of IP and cookie. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` We can also turn off developer mode completely, even for localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Note that the value `true` turns on developer mode by hard, which should never happen on a production server. @@ -90,7 +115,7 @@ Debugging Tool Tracy For easy debugging, we will turn on the great tool [Tracy |tracy:]. In developer mode it visualizes errors and in production mode it logs errors to the specified directory: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Temporary Files Nette uses the cache for DI container, RobotLoader, templates, etc. Therefore it is necessary to set the path to the directory where the cache will be stored: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` On Linux or macOS, set the [write permissions |nette:troubleshooting#Setting directory permissions] for directories `log/` and `temp/`. @@ -112,7 +137,7 @@ RobotLoader Usually, we will want to automatically load the classes using [RobotLoader |robot-loader:], so we have to start it up and let it load classes from the directory where `Bootstrap.php` is located (i.e. `__DIR__`) and all its subdirectories: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Timezone Configurator allows you to specify a timezone for your application. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ In the development mode, the container is automatically updated each time you ch Configuration files are loaded using `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` The method `addConfig()` can be called multiple times to add multiple files. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Static Parameters Parameters used in configuration files can be defined [in the section `parameters`|dependency-injection:configuration#parameters] and also passed (or overwritten) by the `addStaticParameters()` method (it has alias `addParameters()`). It is important that different parameter values cause the generation of additional DI containers, i.e. additional classes. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Dynamic Parameters We can also add dynamic parameters to the container, their different values, unlike static parameters, will not cause the generation of new DI containers. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Environment variables could be easily made available using dynamic parameters. We can access them via `%env.variable%` in configuration files. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Create a new instance and insert it in bootstrap: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Different Environments ====================== -Feel free to customize the `Bootstrap` class to suit your needs. You can add parameters to the `boot()` method to differentiate web projects, or add other methods, such as `bootForTests()`, which initializes the environment for unit tests, `bootForCli()` for scripts called from the command line, and so on. +Don't hesitate to customize the `Bootstrap` class according to your needs. You can add parameters to the `bootWebApplication()` method to differentiate between web projects. Alternatively, you can add other methods, such as `bootTestEnvironment()` to initialize the environment for unit tests, `bootConsoleApplication()` for scripts called from the command line, and so on. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container { - $configurator = self::boot(); Tester\Environment::setup(); // Nette Tester initialization - return $configurator; + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container +{ + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/es/bootstrap.texy b/application/es/bootstrap.texy index d1753e0a9f..19bb56c0ba 100644 --- a/application/es/bootstrap.texy +++ b/application/es/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // El configurador se encarga de configurar el entorno y los servicios de la aplicación. + $this->configurator = new Configurator; + // Establecer el directorio para los archivos temporales generados por Nette (por ejemplo, plantillas compiladas). + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette es inteligente, y el modo de desarrollo se activa automáticamente, + // o puede habilitarlo para una dirección IP específica descomentando la siguiente línea: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Habilita Tracy: la última herramienta de depuración "navaja suiza". + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: carga automáticamente todas las clases en el directorio dado + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Carga archivos de configuración + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -En el caso de las aplicaciones web, el archivo inicial es `index.php`, que se encuentra en el directorio público `www/`. Permite a la clase `Bootstrap` inicializar el entorno y devolver el `$configurator` que crea el contenedor DI. Luego obtiene el servicio `Application`, que ejecuta la aplicación web: +El archivo inicial para aplicaciones web es `index.php`, ubicado en el directorio público `www/`. Utiliza la clase `Bootstrap` para inicializar el entorno y crear un contenedor DI. A continuación, obtiene el servicio `Application` del contenedor, que lanza la aplicación web: ```php -// initialize the environment + get Configurator object -$configurator = App\Bootstrap::boot(); -// create a DI container -$container = $configurator->createContainer(); -// DI container creates a Nette\Application\Application object +$bootstrap = new App\Bootstrap; +// Inicializar el entorno + crear un contenedor DI +$container = $bootstrap->bootWebApplication(); +// El contenedor DI crea un objeto Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -// start Nette application +// Inicia la aplicación Nette y gestiona la petición entrante $application->run(); ``` @@ -66,19 +91,19 @@ La selección del modo se hace por autodetección, por lo que normalmente no hay Si desea habilitar el modo de desarrollo en otros casos, por ejemplo, para los programadores que acceden desde una dirección IP específica, puede utilizar `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // one or more IP addresses +$this->configurator->setDebugMode('23.75.345.200'); // one or more IP addresses ``` Recomendamos encarecidamente combinar una dirección IP con una cookie. Almacenaremos un token secreto en la cookie `nette-debug`, por ejemplo `secret1234`, y el modo de desarrollo se activará para los programadores con esta combinación de IP y cookie. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` También podemos desactivar completamente el modo de desarrollo, incluso para localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Nótese que el valor `true` activa el modo desarrollador por fuerza, lo que nunca debería ocurrir en un servidor de producción. @@ -90,7 +115,7 @@ Herramienta de depuración Tracy .[#toc-debugging-tool-tracy] Para facilitar la depuración, activaremos la gran herramienta [Tracy |tracy:]. En modo desarrollador visualiza los errores y en modo producción los registra en el directorio especificado: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Archivos temporales .[#toc-temporary-files] Nette utiliza la caché para el contenedor DI, RobotLoader, plantillas, etc. Por lo tanto es necesario establecer la ruta al directorio donde se almacenará la caché: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` En Linux o macOS, establezca los [permisos de escritura |nette:troubleshooting#Setting directory permissions] para los directorios `log/` y `temp/`. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Normalmente, querremos cargar automáticamente las clases usando [RobotLoader |robot-loader:], así que tenemos que iniciarlo y dejar que cargue las clases desde el directorio donde se encuentra `Bootstrap.php` (es decir, `__DIR__`) y todos sus subdirectorios: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Zona horaria .[#toc-timezone] Configurator le permite especificar una zona horaria para su aplicación. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ En el modo de desarrollo, el contenedor se actualiza automáticamente cada vez q Los archivos de configuración se cargan utilizando `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` El método `addConfig()` se puede llamar varias veces para añadir varios archivos. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Parámetros estáticos .[#toc-static-parameters] Los parámetros utilizados en los archivos de configuración pueden definirse [en la sección `parameters` |dependency-injection:configuration#parameters] y también pasarse (o sobrescribirse) por el método `addStaticParameters()` (tiene el alias `addParameters()`). Es importante que los diferentes valores de los parámetros provoquen la generación de contenedores DI adicionales, es decir, clases adicionales. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Parámetros dinámicos .[#toc-dynamic-parameters] También podemos añadir parámetros dinámicos al contenedor, sus diferentes valores, a diferencia de los parámetros estáticos, no provocarán la generación de nuevos contenedores DI. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Las variables de entorno podrían estar fácilmente disponibles utilizando parámetros dinámicos. Podemos acceder a ellas a través de `%env.variable%` en archivos de configuración. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Creamos una nueva instancia y la insertamos en bootstrap: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Diferentes entornos .[#toc-different-environments] ================================================== -Siéntete libre de personalizar la clase `Bootstrap` para adaptarla a tus necesidades. Puedes añadir parámetros al método `boot()` para diferenciar proyectos web, o añadir otros métodos, como `bootForTests()`, que inicializa el entorno para pruebas unitarias, `bootForCli()` para scripts llamados desde la línea de comandos, etc. +No dude en personalizar la clase `Bootstrap` según sus necesidades. Puedes añadir parámetros al método `bootWebApplication()` para diferenciar entre proyectos web. Alternativamente, puedes añadir otros métodos, como `bootTestEnvironment()` para inicializar el entorno para pruebas unitarias, `bootConsoleApplication()` para scripts llamados desde la línea de comandos, etc. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container +{ + Tester\Environment::setup(); // Inicialización del comprobador de redes + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container { - $configurator = self::boot(); - Tester\Environment::setup(); // Nette Tester initialization - return $configurator; + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/fr/bootstrap.texy b/application/fr/bootstrap.texy index dbe7e4bc85..32c12e829b 100644 --- a/application/fr/bootstrap.texy +++ b/application/fr/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Le configurateur est chargé de configurer l'environnement et les services de l'application. + $this->configurator = new Configurator; + // Définir le répertoire pour les fichiers temporaires générés par Nette (par exemple, les modèles compilés) + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette est intelligent, et le mode développement est activé automatiquement, + // ou vous pouvez l'activer pour une adresse IP spécifique en décommentant la ligne suivante: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Active Tracy: l'ultime outil de débogage "couteau suisse". + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: charge automatiquement toutes les classes dans le répertoire donné + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Chargement des fichiers de configuration + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -Dans le cas des applications web, le fichier initial est `index.php`, qui se trouve dans le répertoire public `www/`. Il laisse la classe `Bootstrap` pour initialiser l'environnement et retourne la classe `$configurator` qui crée le conteneur DI. Ensuite, il obtient le service `Application`, qui exécute l'application web : +Le fichier initial des applications web est `index.php`, situé dans le répertoire public `www/`. Il utilise la classe `Bootstrap` pour initialiser l'environnement et créer un conteneur DI. Ensuite, il obtient le service `Application` du conteneur, ce qui lance l'application web : ```php -// initialisation de l'environnement + obtention de l'objet Configurateur -$configurator = App\Bootstrap::boot(); -// créer un conteneur DI -$container = $configurator->createContainer(); +$bootstrap = new App\Bootstrap; +// Initialiser l'environnement + créer un conteneur DI +$container = $bootstrap->bootWebApplication(); // Le conteneur DI crée un objet Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -// Démarrage de l'application Nette +// Démarrer l'application Nette et traiter la demande entrante $application->run(); ``` @@ -66,19 +91,19 @@ La sélection du mode se fait par autodétection, il n'est donc généralement p Si vous souhaitez activer le mode développement dans d'autres cas, par exemple pour les programmeurs accédant depuis une adresse IP spécifique, vous pouvez utiliser `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // une ou plusieurs adresses IP +$this->configurator->setDebugMode('23.75.345.200'); // une ou plusieurs adresses IP ``` Nous recommandons vivement de combiner une adresse IP avec un cookie. Nous stockerons un jeton secret dans le cookie `nette-debug`, par exemple `secret1234`, et le mode de développement sera activé pour les programmeurs avec cette combinaison d'IP et de cookie. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Nous pouvons également désactiver complètement le mode de développement, même pour localhost : ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Notez que la valeur `true` active le mode développeur par défaut, ce qui ne devrait jamais arriver sur un serveur de production. @@ -90,7 +115,7 @@ Outil de débogage Tracy .[#toc-debugging-tool-tracy] Pour faciliter le débogage, nous allons activer l'excellent outil [Tracy |tracy:]. En mode développeur, il visualise les erreurs et en mode production, il enregistre les erreurs dans le répertoire spécifié : ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Fichiers temporaires .[#toc-temporary-files] Nette utilise le cache pour le conteneur DI, RobotLoader, les modèles, etc. Il est donc nécessaire de définir le chemin d'accès au répertoire où le cache sera stocké : ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` Sous Linux ou macOS, définissez les [droits d'écriture |nette:troubleshooting#Setting directory permissions] pour les répertoires `log/` et `temp/`. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] En général, nous voulons charger automatiquement les classes à l'aide de [RobotLoader |robot-loader:], nous devons donc le lancer et le laisser charger les classes du répertoire où se trouve `Bootstrap.php` (c'est-à-dire `__DIR__`) et de tous ses sous-répertoires : ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Fuseau horaire .[#toc-timezone] Le configurateur vous permet de spécifier un fuseau horaire pour votre application. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ En mode développement, le conteneur est automatiquement mis à jour chaque fois Les fichiers de configuration sont chargés à l'aide de `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` La méthode `addConfig()` peut être appelée plusieurs fois pour ajouter plusieurs fichiers. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Paramètres statiques .[#toc-static-parameters] Les paramètres utilisés dans les fichiers de configuration peuvent être définis [dans la section `parameters` |dependency-injection:configuration#parameters] et également transmis (ou écrasés) par la méthode `addStaticParameters()` (qui a un alias `addParameters()`). Il est important que les différentes valeurs des paramètres entraînent la génération de conteneurs DI supplémentaires, c'est-à-dire de classes supplémentaires. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Paramètres dynamiques .[#toc-dynamic-parameters] Nous pouvons également ajouter des paramètres dynamiques au conteneur, leurs différentes valeurs, contrairement aux paramètres statiques, ne provoqueront pas la génération de nouveaux conteneurs DI. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Les variables d'environnement peuvent être facilement mises à disposition à l'aide de paramètres dynamiques. Nous pouvons y accéder via `%env.variable%` dans les fichiers de configuration. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Créez une nouvelle instance et insérez-la dans bootstrap : ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Différents environnements .[#toc-different-environments] ======================================================== -N'hésitez pas à personnaliser la classe `Bootstrap` en fonction de vos besoins. Vous pouvez ajouter des paramètres à la méthode `boot()` pour différencier les projets Web, ou ajouter d'autres méthodes, comme `bootForTests()`, qui initialise l'environnement pour les tests unitaires, `bootForCli()` pour les scripts appelés depuis la ligne de commande, etc. +N'hésitez pas à personnaliser la classe `Bootstrap` en fonction de vos besoins. Vous pouvez ajouter des paramètres à la méthode `bootWebApplication()` pour différencier les projets web. Vous pouvez également ajouter d'autres méthodes, telles que `bootTestEnvironment()` pour initialiser l'environnement des tests unitaires, `bootConsoleApplication()` pour les scripts appelés à partir de la ligne de commande, etc. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container +{ + Tester\Environment::setup(); // Initialisation du testeur Nette + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container { - $configurator = self::boot(); - Tester\Environment::setup(); // Initialisation du testeur de nappe - return $configurator; + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/hu/bootstrap.texy b/application/hu/bootstrap.texy index 49be7dca25..a05ab01083 100644 --- a/application/hu/bootstrap.texy +++ b/application/hu/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // A konfigurátor felelős az alkalmazási környezet és a szolgáltatások beállításáért. + $this->configurator = new Configurator; + // A Nette által generált ideiglenes fájlok (pl. lefordított sablonok) könyvtárának beállítása. + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // A Nette intelligens, és a fejlesztői üzemmód automatikusan bekapcsol, + // vagy engedélyezheti egy adott IP-címre a következő sor megjegyzésének feloldásával: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Bekapcsolja a Tracy-t: a végső "svájci bicska" hibakeresési eszköz. + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: automatikusan feltölti az összes osztályt a megadott könyvtárban. + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Konfigurációs fájlok betöltése + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -A webes alkalmazások esetében a kezdő fájl a `index.php`, amely a `www/` nyilvános könyvtárban található. Ez lehetővé teszi a `Bootstrap` osztály számára, hogy inicializálja a környezetet, és visszaadja a `$configurator`, amely létrehozza a DI konténert. Ezután megszerzi a `Application` szolgáltatást, amely a webalkalmazást futtatja: +A webes alkalmazások kezdőfájlja a `index.php`, amely a `www/` nyilvános könyvtárban található. A `Bootstrap` osztályt használja a környezet inicializálásához és a DI konténer létrehozásához. Ezután megszerzi a `Application` szolgáltatást a konténerből, amely elindítja a webalkalmazást: ```php -// a környezet inicializálása + konfigurátor objektum kinyerése -$configurator = App\Bootstrap::boot(); -// DI konténer létrehozása -$container = $configurator->createContainer(); +$bootstrap = new App\Bootstrap; +// A környezet inicializálása + DI konténer létrehozása +$container = $bootstrap->bootWebApplication(); // A DI konténer létrehoz egy Nette\Application\Application objektumot. $application = $container->getByType(Nette\Application\Application::class); -// Nette alkalmazás indítása +// A Nette-alkalmazás elindítása és a bejövő kérések kezelése. $application->run(); ``` @@ -66,19 +91,19 @@ A mód kiválasztása automatikus felismeréssel történik, így általában ne Ha más esetekben, például egy adott IP-címről hozzáférő programozók számára szeretné engedélyezni a fejlesztési üzemmódot, akkor a `setDebugMode()` címet használhatja: ```php -$configurator->setDebugMode('23.75.345.200'); // egy vagy több IP-cím +$this->configurator->setDebugMode('23.75.345.200'); // egy vagy több IP-cím ``` Mindenképpen javasoljuk az IP-cím és a cookie kombinálását. A `nette-debug` cookie-ban tárolunk egy titkos tokent, pl. `secret1234`, és a fejlesztési mód az IP és a cookie ilyen kombinációjával rendelkező programozók számára aktiválódik. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` A fejlesztői módot teljesen ki is kapcsolhatjuk, akár a localhost esetében is: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` A `true` érték keményen bekapcsolja a fejlesztői módot, ami soha nem történhet meg egy termelő szerveren. @@ -90,7 +115,7 @@ Hibakereső eszköz Tracy .[#toc-debugging-tool-tracy] Az egyszerű hibakeresés érdekében bekapcsoljuk a [Tracy |tracy:] nevű nagyszerű eszközt. Fejlesztői módban megjeleníti a hibákat, termelési módban pedig a megadott könyvtárba naplózza a hibákat: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Ideiglenes fájlok .[#toc-temporary-files] A Nette a DI konténer, a RobotLoader, a sablonok stb. számára használja a gyorsítótárat. Ezért szükséges annak a könyvtárnak az elérési útvonalát beállítani, ahol a gyorsítótár tárolásra kerül: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` Linuxon vagy macOS-en állítsa be a `log/` és a `temp/` könyvtárak [írási engedélyeit |nette:troubleshooting#Setting directory permissions]. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Általában a [RobotLoader |robot-loader:] segítségével szeretnénk automatikusan betölteni az osztályokat, ezért el kell indítanunk, és hagynunk kell, hogy betöltse az osztályokat abból a könyvtárból, ahol a `Bootstrap.php` található (azaz `__DIR__`) és annak összes alkönyvtárából: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Időzóna .[#toc-timezone] A Configurator lehetővé teszi, hogy megadjon egy időzónát az alkalmazásához. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ Fejlesztői üzemmódban a konténer automatikusan frissül minden alkalommal, a A konfigurációs fájlok betöltése a `addConfig()` segítségével történik: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` A `addConfig()` metódus többször is meghívható több fájl hozzáadásához. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Statikus paraméterek .[#toc-static-parameters] A konfigurációs fájlokban használt paramétereket a [`parameters` szakaszban |dependency-injection:configuration#parameters] lehet definiálni, és a `addStaticParameters()` metódus (amelynek alias neve `addParameters()`) is átadhatja (vagy felülírhatja). Fontos, hogy a különböző paraméterértékek további DI-konténerek, azaz további osztályok generálását okozzák. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Dinamikus paraméterek .[#toc-dynamic-parameters] A konténerhez dinamikus paramétereket is hozzáadhatunk, ezek eltérő értékei a statikus paraméterekkel ellentétben nem okoznak új DI-konténerek generálását. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ A környezeti változókat könnyen elérhetővé tehetnénk dinamikus paraméterek segítségével. A konfigurációs fájlokban a `%env.variable%` címen keresztül érhetjük el őket. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Hozzunk létre egy új példányt, és illesszük be a bootstrapbe: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Különböző környezetek .[#toc-different-environments] ==================================================== -Nyugodtan testre szabhatja a `Bootstrap` osztályt, hogy megfeleljen az igényeinek. A `boot()` metódushoz paramétereket adhat a webes projektek megkülönböztetéséhez, vagy más metódusokat is hozzáadhat, például a `bootForTests()`, amely inicializálja a környezetet a unit tesztekhez, a `bootForCli()` a parancssorból hívott szkriptekhez, és így tovább. +Ne habozzon, ha a `Bootstrap` osztályt saját igényei szerint alakíthatja. A `bootWebApplication()` metódushoz paramétereket adhat hozzá a webes projektek megkülönböztetése érdekében. Alternatívaként más metódusokat is hozzáadhat, például a `bootTestEnvironment()` a környezet inicializálásához a unit tesztekhez, a `bootConsoleApplication()` a parancssorból hívott szkriptekhez stb. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container { - $configurator = self::boot(); Tester\Environment::setup(); // Nette Tester inicializálása - return $configurator; + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container +{ + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/it/bootstrap.texy b/application/it/bootstrap.texy index 4459c3c534..b338b46064 100644 --- a/application/it/bootstrap.texy +++ b/application/it/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Il configuratore è responsabile dell'impostazione dell'ambiente applicativo e dei servizi. + $this->configurator = new Configurator; + // Impostare la directory per i file temporanei generati da Nette (ad esempio, i modelli compilati). + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette è intelligente e la modalità di sviluppo si attiva automaticamente, + // oppure si può attivare per un indirizzo IP specifico decommentando la seguente riga: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Abilita Tracy: lo strumento di debug per eccellenza, il "coltellino svizzero". + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: carica automaticamente tutte le classi nella cartella data + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Carica i file di configurazione + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -Nel caso delle applicazioni web, il file iniziale è `index.php`, che si trova nella cartella pubblica `www/`. Permette alla classe `Bootstrap` di inizializzare l'ambiente e restituisce la classe `$configurator` che crea il contenitore DI. Quindi ottiene il servizio `Application`, che esegue l'applicazione web: +Il file iniziale per le applicazioni web è `index.php`, situato nella cartella pubblica `www/`. Utilizza la classe `Bootstrap` per inizializzare l'ambiente e creare un contenitore DI. Quindi, ottiene il servizio `Application` dal contenitore, che lancia l'applicazione web: ```php -// inizializzare l'ambiente + ottenere l'oggetto Configuratore -$configurator = App\Bootstrap::boot(); -// creare un contenitore DI -$container = $configurator->createContainer(); -// Il contenitore DI crea un oggetto Nette\Application\Application +$bootstrap = new App\Bootstrap; +// Inizializzare l'ambiente + creare un contenitore DI +$container = $bootstrap->bootWebApplication(); +// Il contenitore DI crea un oggetto NetteApplicationApplication $application = $container->getByType(Nette\Application\Application::class); -// avvia l'applicazione Nette +// Avviare l'applicazione Nette e gestire la richiesta in arrivo $application->run(); ``` @@ -66,19 +91,19 @@ La selezione della modalità avviene tramite il rilevamento automatico, quindi d Se si vuole abilitare la modalità di sviluppo in altri casi, ad esempio per i programmatori che accedono da un indirizzo IP specifico, si può usare `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // uno o più indirizzi IP +$this->configurator->setDebugMode('23.75.345.200'); // uno o più indirizzi IP ``` Consigliamo assolutamente di combinare un indirizzo IP con un cookie. Nel cookie `nette-debug` verrà memorizzato un token segreto, ad esempio `secret1234`, e la modalità di sviluppo verrà attivata per i programmatori con questa combinazione di IP e cookie. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Possiamo anche disattivare completamente la modalità sviluppatore, anche per localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Si noti che il valore `true` attiva la modalità sviluppatore, cosa che non dovrebbe mai accadere su un server di produzione. @@ -90,7 +115,7 @@ Strumento di debug Tracy .[#toc-debugging-tool-tracy] Per facilitare il debug, attiviamo l'ottimo strumento [Tracy |tracy:]. In modalità sviluppatore visualizza gli errori e in modalità produzione li registra nella directory specificata: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ File temporanei .[#toc-temporary-files] Nette utilizza la cache per il contenitore DI, il RobotLoader, i modelli, ecc. Per questo motivo è necessario impostare il percorso della cartella in cui verrà memorizzata la cache: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` Su Linux o macOS, impostare i [permessi di scrittura |nette:troubleshooting#Setting directory permissions] per le directory `log/` e `temp/`. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Di solito, vogliamo caricare automaticamente le classi usando [RobotLoader |robot-loader:], quindi dobbiamo avviarlo e fargli caricare le classi dalla directory in cui si trova `Bootstrap.php` (cioè `__DIR__`) e da tutte le sue sottodirectory: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Fuso orario .[#toc-timezone] Il configuratore consente di specificare un fuso orario per l'applicazione. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ In modalità di sviluppo, il contenitore viene aggiornato automaticamente ogni v I file di configurazione vengono caricati usando `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Il metodo `addConfig()` può essere richiamato più volte per aggiungere più file. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Parametri statici .[#toc-static-parameters] I parametri usati nei file di configurazione possono essere definiti [nella sezione `parameters` |dependency-injection:configuration#parameters] e anche passati (o sovrascritti) dal metodo `addStaticParameters()` (ha l'alias `addParameters()`). È importante che valori diversi dei parametri causino la generazione di contenitori DI aggiuntivi, cioè di classi aggiuntive. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Parametri dinamici .[#toc-dynamic-parameters] Possiamo anche aggiungere parametri dinamici al contenitore; i loro diversi valori, a differenza dei parametri statici, non causeranno la generazione di nuovi contenitori DI. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Le variabili d'ambiente possono essere facilmente rese disponibili usando parametri dinamici. Possiamo accedervi tramite `%env.variable%` nei file di configurazione. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Creare una nuova istanza e inserirla in bootstrap: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Ambienti diversi .[#toc-different-environments] =============================================== -Sentitevi liberi di personalizzare la classe `Bootstrap` in base alle vostre esigenze. Si possono aggiungere parametri al metodo `boot()` per differenziare i progetti web, oppure aggiungere altri metodi, come `bootForTests()`, che inizializza l'ambiente per i test unitari, `bootForCli()` per gli script chiamati dalla riga di comando e così via. +Non esitate a personalizzare la classe `Bootstrap` in base alle vostre esigenze. Si possono aggiungere parametri al metodo `bootWebApplication()` per differenziare i progetti web. In alternativa, si possono aggiungere altri metodi, come `bootTestEnvironment()` per inizializzare l'ambiente per i test unitari, `bootConsoleApplication()` per gli script chiamati dalla riga di comando e così via. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container +{ + Tester\Environment::setup(); // Inizializzazione del tester Nette + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container { - $configurator = self::boot(); - Tester\Environment::setup(); // Nette Tester initialization - return $configurator; + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/pl/bootstrap.texy b/application/pl/bootstrap.texy index cfbd2d5f09..084d93b416 100644 --- a/application/pl/bootstrap.texy +++ b/application/pl/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Konfigurator jest odpowiedzialny za konfigurację środowiska aplikacji i usług. + $this->configurator = new Configurator; + // Ustawienie katalogu dla plików tymczasowych generowanych przez Nette (np. skompilowanych szablonów). + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette jest inteligentny i tryb deweloperski włącza się automatycznie, + // lub można go włączyć dla określonego adresu IP, odkomentowując następującą linię: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Włącza Tracy: najlepsze narzędzie do debugowania. + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: automatycznie ładuje wszystkie klasy w podanym katalogu + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Ładowanie plików konfiguracyjnych + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -Podstawowym plikiem w przypadku aplikacji internetowych jest `index.php`, który znajduje się w katalogu publicznym `www/`. Spowoduje to, że klasa Bootstrap zainicjuje środowisko i zwróci `$configurator`, a następnie wyprodukuje kontener DI. Następnie pobiera z niego usługę `Application`, która uruchamia aplikację internetową: +Początkowym plikiem dla aplikacji internetowych jest `index.php`, znajdujący się w publicznym katalogu `www/`. Używa on klasy `Bootstrap` do zainicjowania środowiska i utworzenia kontenera DI. Następnie uzyskuje usługę `Application` z kontenera, który uruchamia aplikację internetową: ```php -// inicjalizacja środowiska + uzyskanie obiektu Configurator -$configurator = App\Bootstrap::boot(); -// tworzenie kontenera DI -$container = $configurator->createContainer(); -// Kontener DI tworzy obiekt "Nette +$bootstrap = new App\Bootstrap; +// Inicjalizacja środowiska + utworzenie kontenera DI +$container = $bootstrap->bootWebApplication(); +// Kontener DI tworzy obiekt Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -// uruchomienie aplikacji Nette +// Uruchom aplikację Nette i obsłuż przychodzące żądanie $application->run(); ``` @@ -66,19 +91,19 @@ Wybór trybu odbywa się poprzez autodetekcję, więc zazwyczaj nie ma potrzeby Jeśli chcemy włączyć tryb deweloperski w innych przypadkach, takich jak programiści uzyskujący dostęp z określonego adresu IP, używamy `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // można również określić pole adresu IP +$this->configurator->setDebugMode('23.75.345.200'); // można również określić pole adresu IP ``` Zdecydowanie zalecamy połączenie adresu IP z plikiem cookie. W pliku cookie `nette-debug` przechowujemy tajny token, np. `secret1234`, i w ten sposób umożliwiamy tryb deweloperski dla programistów uzyskujących dostęp z określonego adresu IP i posiadających token w pliku cookie: ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Możemy również całkowicie wyłączyć tryb deweloperski, nawet dla localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Uwaga, wartość `true` domyślnie włącza tryb deweloperski, co nigdy nie może mieć miejsca na serwerze produkcyjnym. @@ -90,7 +115,7 @@ Narzędzie do debugowania Tracy .[#toc-debugging-tool-tracy] Aby ułatwić debugowanie, włączmy wspaniałe narzędzie [Tracy |tracy:]. Wizualizuje błędy w trybie deweloperskim i loguje błędy w trybie produkcyjnym do podanego katalogu: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Pliki tymczasowe .[#toc-temporary-files] Nette używa buforowania dla kontenera DI, RobotLoader, szablonów itp. Dlatego musisz ustawić ścieżkę do katalogu, w którym będzie przechowywany cache: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` W systemach Linux lub macOS ustaw katalogi `log/` i `temp/` na uprawnienia do [zapisu |nette:troubleshooting#Setting-Directory-Permissions]. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Zazwyczaj będziemy chcieli automatycznie załadować klasy za pomocą [RobotLoader |robot-loader:], więc musimy go uruchomić i kazać mu załadować klasy z katalogu, w którym znajduje się `Bootstrap.php` (czyli `__DIR__`), oraz z wszelkich podkatalogów: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Strefa czasowa .[#toc-timezone] Domyślną strefę czasową można ustawić za pośrednictwem konfiguratora. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ W trybie deweloperskim kontener jest automatycznie aktualizowany przy każdej zm Pliki konfiguracyjne są ładowane za pomocą `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Jeśli chcemy dodać więcej plików konfiguracyjnych, możemy wywołać funkcję `addConfig()` wielokrotnie. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Parametry statyczne .[#toc-static-parameters] Parametry wykorzystywane w plikach konfiguracyjnych można zdefiniować [w sekcji `parameters` |dependency-injection:configuration#parameters], a także przekazać (lub nadpisać) za pomocą metody `addStaticParameters()` (posiada ona alias `addParameters()`). Co ważne, różne wartości parametrów spowodują wygenerowanie dodatkowych kontenerów DI, czyli dodatkowych klas. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Parametry dynamiczne .[#toc-dynamic-parameters] Do kontenera możemy również dodać parametry dynamiczne, których różne wartości, w przeciwieństwie do parametrów statycznych, nie będą powodowały generowania nowych kontenerów DI. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Możemy po prostu dodać np. zmienne środowiskowe, do których następnie możemy się odwołać w konfiguracji pisząc `%env.variable%`. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: A w bootstrapie wstawiamy obiekt do kontenera: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Różne środowiska .[#toc-different-environments] =============================================== -Zapraszamy do dostosowania klasy Bootstrap do swoich potrzeb. Możesz dodać parametry do metody `boot()`, aby odróżnić projekty internetowe, lub dodać inne metody, takie jak `bootForTests()`, która inicjalizuje środowisko dla testów jednostkowych, `bootForCli()` dla skryptów wywoływanych z linii poleceń itp. +Nie wahaj się dostosować klasy `Bootstrap` do swoich potrzeb. Możesz dodać parametry do metody `bootWebApplication()`, aby rozróżnić projekty internetowe. Alternatywnie można dodać inne metody, takie jak `bootTestEnvironment()` do inicjalizacji środowiska dla testów jednostkowych, `bootConsoleApplication()` dla skryptów wywoływanych z wiersza poleceń itp. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container +{ + Tester\Environment::setup(); // Inicjalizacja testera sieci + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container { - $configurator = self::boot(); - Tester\Environment::setup(); // inicializace Nette Testeru - return $configurator; + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/pt/bootstrap.texy b/application/pt/bootstrap.texy index e95d09a093..1428498866 100644 --- a/application/pt/bootstrap.texy +++ b/application/pt/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // O configurador é responsável pela configuração do ambiente e dos serviços do aplicativo. + $this->configurator = new Configurator; + // Defina o diretório para os arquivos temporários gerados pelo Nette (por exemplo, modelos compilados) + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // O Nette é inteligente e o modo de desenvolvimento é ativado automaticamente, + // ou você pode ativá-lo para um endereço IP específico, descomentando a seguinte linha: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Habilita o Tracy: a melhor ferramenta de depuração do tipo "canivete suíço". + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: carrega automaticamente todas as classes no diretório fornecido + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Carregar arquivos de configuração + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -No caso de aplicações web, o arquivo inicial é `index.php`, que está localizado no diretório público `www/`. Ele permite que a classe `Bootstrap` inicialize o ambiente e devolva o `$configurator` que cria o contêiner DI. Em seguida, obtém o serviço `Application`, que executa a aplicação web: +O arquivo inicial para aplicativos Web é `index.php`, localizado no diretório público `www/`. Ele usa a classe `Bootstrap` para inicializar o ambiente e criar um contêiner DI. Em seguida, ele obtém o serviço `Application` do contêiner, que inicia o aplicativo Web: ```php -// inicializar o ambiente + obter objeto Configurador -$configurator = App\Bootstrap::boot(); -// criar um recipiente DI -$container = $configurator->createContainer(); -// Recipiente DI cria um objeto de aplicação Nette +$bootstrap = new App\Bootstrap; +// Inicializar o ambiente + criar um contêiner DI +$container = $bootstrap->bootWebApplication(); +// O contêiner DI cria um objeto Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -// iniciar a aplicação Nette +// Iniciar o aplicativo Nette e tratar a solicitação de entrada $application->run(); ``` @@ -66,19 +91,19 @@ A seleção do modo é feita por autodetecção, de modo que normalmente não h Se você quiser ativar o modo de desenvolvimento em outros casos, por exemplo, para programadores que acessam de um endereço IP específico, você pode usar `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // um ou mais endereços IP +$this->configurator->setDebugMode('23.75.345.200'); // um ou mais endereços IP ``` Definitivamente, recomendamos combinar um endereço IP com um cookie. Armazenaremos um token secreto no cookie `nette-debug`, por exemplo `secret1234`, e o modo de desenvolvimento será ativado para programadores com esta combinação de IP e cookie. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Também podemos desligar completamente o modo desenvolvedor, mesmo para o localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Note que o valor `true` liga o modo desenvolvedor por hard, o que nunca deveria acontecer em um servidor de produção. @@ -90,7 +115,7 @@ Ferramenta de depuração Tracy .[#toc-debugging-tool-tracy] Para facilitar a depuração, vamos acionar a grande ferramenta [Tracy |tracy:]. No modo desenvolvedor ela visualiza os erros e no modo de produção registra os erros no diretório especificado: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Arquivos temporários .[#toc-temporary-files] Nette utiliza o cache para contêiner DI, RobotLoader, modelos, etc. Portanto, é necessário definir o caminho para o diretório onde o cache será armazenado: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` No Linux ou macOS, defina as [permissões de escrita |nette:troubleshooting#Setting directory permissions] para os diretórios `log/` e `temp/`. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Normalmente, queremos carregar automaticamente as classes usando [o RobotLoader |robot-loader:], então temos que iniciá-lo e deixá-lo carregar classes do diretório onde se encontra `Bootstrap.php` (ou seja, `__DIR__`) e todos os seus subdiretórios: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Fuso horário .[#toc-timezone] O Configurador permite que você especifique um fuso horário para sua aplicação. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ No modo de desenvolvimento, o recipiente é atualizado automaticamente cada vez Os arquivos de configuração são carregados usando `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` O método `addConfig()` pode ser chamado várias vezes para adicionar vários arquivos. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Parâmetros estáticos .[#toc-static-parameters] Os parâmetros usados nos arquivos de configuração podem ser definidos [na seção `parameters` |dependency-injection:configuration#parameters] e também passados (ou sobrescritos) pelo método `addStaticParameters()` (tem o pseudônimo `addParameters()`). É importante que diferentes valores de parâmetros causem a geração de recipientes DI adicionais, ou seja, classes adicionais. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Parâmetros dinâmicos .[#toc-dynamic-parameters] Também podemos adicionar parâmetros dinâmicos ao recipiente, seus diferentes valores, ao contrário dos parâmetros estáticos, não causarão a geração de novos recipientes DI. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ As variáveis ambientais poderiam ser facilmente disponibilizadas usando parâmetros dinâmicos. Podemos acessá-las via `%env.variable%` em arquivos de configuração. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Criar uma nova instância e inseri-la no bootstrap: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Diferentes Ambientes .[#toc-different-environments] =================================================== -Sinta-se à vontade para personalizar a classe `Bootstrap` de acordo com suas necessidades. Você pode adicionar parâmetros ao método `boot()` para diferenciar projetos web, ou adicionar outros métodos, tais como `bootForTests()`, que inicializa o ambiente para testes unitários, `bootForCli()` para scripts chamados a partir da linha de comando, e assim por diante. +Não hesite em personalizar a classe `Bootstrap` de acordo com suas necessidades. Você pode adicionar parâmetros ao método `bootWebApplication()` para diferenciar os projetos da Web. Como alternativa, você pode adicionar outros métodos, como `bootTestEnvironment()` para inicializar o ambiente para testes de unidade, `bootConsoleApplication()` para scripts chamados pela linha de comando e assim por diante. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container +{ + Tester\Environment::setup(); // Inicialização do Nette Tester + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container { - $configurator = self::boot(); - Tester\Environment::setup(); // Nette Tester initialization - return $configurator; + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/ro/bootstrap.texy b/application/ro/bootstrap.texy index 9daa091f0e..97b1a1fe30 100644 --- a/application/ro/bootstrap.texy +++ b/application/ro/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Configuratorul este responsabil de configurarea mediului și a serviciilor aplicației. + $this->configurator = new Configurator; + // Setați directorul pentru fișierele temporare generate de Nette (de exemplu, șabloane compilate) + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette este inteligent, iar modul de dezvoltare se activează automat, + // sau îl puteți activa pentru o anumită adresă IP prin decomentarea următoarei linii: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Activează Tracy: instrumentul suprem de depanare "swiss army knife". + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: Încarcă automat toate clasele din directorul dat + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Încarcă fișierele de configurare + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -În cazul aplicațiilor web, fișierul inițial este `index.php`, care se află în directorul public `www/`. Acesta permite clasei `Bootstrap` să inițializeze mediul și să returneze `$configurator` care creează containerul DI. Apoi se obține serviciul `Application`, care execută aplicația web: +Fișierul inițial pentru aplicațiile web este `index.php`, situat în directorul public `www/`. Acesta utilizează clasa `Bootstrap` pentru a inițializa mediul și a crea un container DI. Apoi, obține serviciul `Application` din container, care lansează aplicația web: ```php -// inițializarea mediului + obținerea obiectului Configurator -$configurator = App\Bootstrap::boot(); -// creați un container DI -$container = $configurator->createContainer(); -// containerul DI creează un obiect Nette\Application\Application +$bootstrap = new App\Bootstrap; +// Inițializarea mediului + crearea unui container DI +$container = $bootstrap->bootWebApplication(); +// Containerul DI creează un obiect Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -// pornește aplicația Nette +// Porniți aplicația Nette și tratați cererea de intrare $application->run(); ``` @@ -66,19 +91,19 @@ Selectarea modului se face prin autodetecție, astfel încât, de obicei, nu est Dacă doriți să activați modul de dezvoltare în alte cazuri, de exemplu, pentru programatorii care accesează de la o anumită adresă IP, puteți utiliza `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // una sau mai multe adrese IP +$this->configurator->setDebugMode('23.75.345.200'); // una sau mai multe adrese IP ``` Vă recomandăm cu siguranță să combinați o adresă IP cu un cookie. Vom stoca un token secret în cookie-ul `nette-debug`, de exemplu `secret1234`, iar modul de dezvoltare va fi activat pentru programatorii cu această combinație de IP și cookie. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` De asemenea, putem dezactiva complet modul de dezvoltare, chiar și pentru localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Rețineți că valoarea `true` activează modul dezvoltator din greu, ceea ce nu ar trebui să se întâmple niciodată pe un server de producție. @@ -90,7 +115,7 @@ Instrumentul de depanare Tracy .[#toc-debugging-tool-tracy] Pentru o depanare mai ușoară, vom porni minunata unealtă [Tracy |tracy:]. În modul dezvoltator, acesta vizualizează erorile, iar în modul de producție înregistrează erorile în directorul specificat: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Temporary Files .[#toc-temporary-files] Nette utilizează memoria cache pentru DI container, RobotLoader, șabloane etc. Prin urmare, este necesar să setați calea către directorul în care va fi stocată memoria cache: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` Pe Linux sau macOS, setați [permisiunile de scriere |nette:troubleshooting#Setting directory permissions] pentru directoarele `log/` și `temp/`. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] De obicei, vom dori să încărcăm automat clasele folosind [RobotLoader |robot-loader:], așa că trebuie să îl pornim și să îl lăsăm să încarce clasele din directorul în care se află `Bootstrap.php` (adică `__DIR__`) și din toate subdirectoarele sale: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Fusul orar .[#toc-timezone] Configurator vă permite să specificați un fus orar pentru aplicația dumneavoastră. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ Fișierele de configurare sunt de obicei scrise în [formatul NEON |neon:format] Fișierele de configurare sunt încărcate utilizând `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Metoda `addConfig()` poate fi apelată de mai multe ori pentru a adăuga mai multe fișiere. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Parametrii statici .[#toc-static-parameters] Parametrii utilizați în fișierele de configurare pot fi definiți [în secțiunea `parameters` |dependency-injection:configuration#parameters] și, de asemenea, pot fi trecuți (sau suprascriși) prin metoda `addStaticParameters()` (are pseudonimul `addParameters()`). Este important ca valorile diferite ale parametrilor să determine generarea de containere DI suplimentare, adică de clase suplimentare. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Parametrii dinamici .[#toc-dynamic-parameters] De asemenea, putem adăuga parametri dinamici la container, valorile lor diferite, spre deosebire de parametrii statici, nu vor determina generarea de noi containere DI. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Variabilele de mediu ar putea fi puse cu ușurință la dispoziție prin intermediul parametrilor dinamici. Le putem accesa prin intermediul `%env.variable%` în fișierele de configurare. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Creați o nouă instanță și inserați-o în bootstrap: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Diferite medii .[#toc-different-environments] ============================================= -Nu ezitați să personalizați clasa `Bootstrap` pentru a se potrivi nevoilor dumneavoastră. Puteți adăuga parametri la metoda `boot()` pentru a diferenția proiectele web sau puteți adăuga alte metode, cum ar fi `bootForTests()`, care inițializează mediul pentru testele unitare, `bootForCli()` pentru scripturile apelate din linia de comandă și așa mai departe. +Nu ezitați să personalizați clasa `Bootstrap` în funcție de nevoile dumneavoastră. Puteți adăuga parametri la metoda `bootWebApplication()` pentru a face diferența între proiectele web. Alternativ, puteți adăuga alte metode, cum ar fi `bootTestEnvironment()` pentru a inițializa mediul pentru testele unitare, `bootConsoleApplication()` pentru scripturile apelate din linia de comandă și așa mai departe. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container { - $configurator = self::boot(); Tester\Environment::setup(); // Inițializarea Nette Tester - return $configurator; + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container +{ + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/ru/bootstrap.texy b/application/ru/bootstrap.texy index a0036cf7a1..82e18f8d6b 100644 --- a/application/ru/bootstrap.texy +++ b/application/ru/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Конфигуратор отвечает за настройку среды и служб приложения. + $this->configurator = new Configurator; + // Задайте директорию для временных файлов, создаваемых Nette (например, скомпилированных шаблонов). + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette умный, и режим разработки включается автоматически, + // или вы можете включить его для определенного IP-адреса, откомментировав следующую строку: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Включает Tracy: основной инструмент отладки в виде "армейского ножа". + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: автозагрузка всех классов в заданной директории + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Загрузка конфигурационных файлов + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php ========= -В случае веб-приложений начальным файлом является `index.php`, который находится в общедоступном каталоге `www/`. Он позволяет классу `Bootstrap` инициализировать среду и возвращает `$configurator`, который создает контейнер DI. Затем он получает сервис `Application`, запускающий веб-приложение: +Начальным файлом для веб-приложений является `index.php`, расположенный в публичной директории `www/`. Он использует класс `Bootstrap` для инициализации среды и создания контейнера DI. Затем он получает из контейнера службу `Application`, которая запускает веб-приложение: ```php -// инициализируем среду + получаем объект Configurator -$configurator = App\Bootstrap::boot(); -// создаем DI-контейнер -$container = $configurator->createContainer(); -// DI-контейнер создайет объект Nette\Application\Application +$bootstrap = new App\Bootstrap; +// Инициализация среды + создание DI-контейнера +$container = $bootstrap->bootWebApplication(); +// DI-контейнер создает объект Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -// запускаем приложение Nette +// Запуск приложения Nette и обработка входящего запроса $application->run(); ``` @@ -66,19 +91,19 @@ Nette различает два основных режима, в которых Если вы хотите включить режим разработки в других случаях, например, для программистов, получающих доступ с определенного IP-адреса, вы можете использовать `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // один или более IP-адресов +$this->configurator->setDebugMode('23.75.345.200'); // один или более IP-адресов ``` Мы определенно рекомендуем сочетать IP-адрес с файлом cookie. Мы будем хранить секретный токен в cookie `nette-debug', например, `secret1234`, и режим разработки будет активирован для программистов с такой комбинацией IP и cookie. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Можно полностью отключить режим разработчика, даже для localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Обратите внимание, что значение `true` жестко включает режим разработчика, чего никогда не должно происходить на рабочем сервере. @@ -90,7 +115,7 @@ $configurator->setDebugMode(false); Для облегчения отладки мы включим замечательный инструмент [Tracy |tracy:]. В режиме разработчика он визуализирует ошибки, а в режиме производства — записывает ошибки в указанный каталог: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ $configurator->enableTracy($rootDir . '/log'); Nette использует кэш для DI-контейнера, RobotLoader, шаблонов и т. д. Поэтому необходимо задать путь к директории, где будет храниться кэш: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` В Linux или macOS установите [права на запись |nette:troubleshooting#Setting-Directory-Permissions] для каталогов `log/` и `temp/`. @@ -112,7 +137,7 @@ RobotLoader Обычно мы хотим автоматически загружать классы с помощью [RobotLoader |robot-loader:], поэтому мы должны запустить его и позволить ему загрузить классы из каталога, в котором находится `Bootstrap.php` (т. е. `__DIR__`) и все его подкаталоги: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ $configurator->createRobotLoader() Configurator позволяет указать часовой пояс для вашего приложения. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ $configurator->setTimeZone('Europe/Prague'); Файлы конфигурации загружаются с помощью `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Метод `addConfig()` может быть вызван несколько раз для добавления нескольких файлов. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ if (PHP_SAPI === 'cli') { Параметры, используемые в файлах конфигурации, могут быть определены [в секции `parameters`|dependency-injection:configuration#parameters] и подхвачены (или перезаписаны) методом `addStaticParameters()` (у него есть алиас `addParameters()`). Важно, что разные значения параметров вызывают генерацию дополнительных DI-контейнеров, то есть дополнительных классов. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ $configurator->addStaticParameters([ Можно также добавить динамические параметры в контейнер. Их разные значения, в отличие от статических параметров, не приведут к генерации новых DI-контейнеров. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Переменные среды могут быть легко доступны с использованием динамических параметров. Мы можем получить доступ к ним через `%env.variable%` в файлах конфигурации. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Создаём новый экземпляр и вставляем его в Bootstrap: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Разные среды .[#toc-different-environments] =========================================== -Не стесняйтесь настроить класс `Bootstrap` в соответствии с вашими потребностями. Вы можете добавлять параметры в метод `boot()` для разделения веб-проектов, или добавлять другие методы, такие как `bootForTests()`, которые инициализируют среду для модульных тестов, `bootForCli()` для скриптов, вызываемых из командной строки, и так далее. +Не стесняйтесь настраивать класс `Bootstrap` в соответствии с вашими потребностями. Вы можете добавить параметры в метод `bootWebApplication()`, чтобы различать веб-проекты. Также можно добавить другие методы, например `bootTestEnvironment()` для инициализации окружения для модульных тестов, `bootConsoleApplication()` для скриптов, вызываемых из командной строки, и так далее. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container +{ + Tester\Environment::setup(); // Инициализация тестера Nette Tester + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container { - $configurator = self::boot(); - Tester\Environment::setup(); // Инициализация Nette Tester - return $configurator; + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/sl/bootstrap.texy b/application/sl/bootstrap.texy index 81ef42aa3d..33f36e50e8 100644 --- a/application/sl/bootstrap.texy +++ b/application/sl/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Konfigurator je odgovoren za nastavitev okolja aplikacije in storitev. + $this->configurator = new Configurator; + // Nastavite imenik za začasne datoteke, ki jih ustvari Nette (npr. sestavljene predloge). + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Program Nette je pameten in razvojni način se vklopi samodejno, + // lahko pa ga za določen naslov IP omogočite tako, da odkomentirate naslednjo vrstico: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Omogoči Tracy: najboljše orodje za razhroščevanje "švicarskega noža". + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: samodejno naloži vse razrede v danem imeniku + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Nalaganje konfiguracijskih datotek + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -Pri spletnih aplikacijah je začetna datoteka `index.php`, ki se nahaja v javnem imeniku `www/`. Omogoča, da razred `Bootstrap` inicializira okolje in vrne `$configurator`, ki ustvari vsebnik DI. Nato pridobi storitev `Application`, ki izvaja spletno aplikacijo: +Začetna datoteka za spletne aplikacije je `index.php`, ki se nahaja v javnem imeniku `www/`. Uporablja razred `Bootstrap` za inicializacijo okolja in ustvarjanje vsebnika DI. Nato iz vsebnika pridobi storitev `Application`, ki zažene spletno aplikacijo: ```php -// inicializacija okolja + pridobitev predmeta Configurator -$configurator = App\Bootstrap::boot(); -// ustvarite vsebnik DI -$container = $configurator->createContainer(); +$bootstrap = new App\Bootstrap; +// Inicializacija okolja + ustvarjanje vsebnika DI +$container = $bootstrap->bootWebApplication(); // vsebnik DI ustvari objekt Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -// zaženite aplikacijo Nette +// Zagnati aplikacijo Nette in obdelati vhodno zahtevo $application->run(); ``` @@ -66,19 +91,19 @@ Izbira načina poteka s samodejnim zaznavanjem, zato običajno ni treba ničesar Če želite omogočiti razvojni način v drugih primerih, na primer za programerje, ki dostopajo z določenega naslova IP, lahko uporabite `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // enega ali več naslovov IP. +$this->configurator->setDebugMode('23.75.345.200'); // enega ali več naslovov IP. ``` Vsekakor priporočamo kombinacijo naslova IP s piškotkom. V piškotek `nette-debug` bomo shranili tajni žeton, npr. `secret1234`, razvojni način pa bo aktiviran za programerje s to kombinacijo IP in piškotka. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Razvojni način lahko tudi popolnoma izklopimo, tudi za lokalni gostitelj: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Vrednost `true` vklopi način za razvijalce, kar se na produkcijskem strežniku ne bi smelo zgoditi. @@ -90,7 +115,7 @@ Orodje za razhroščevanje Tracy .[#toc-debugging-tool-tracy] Za lažje razhroščevanje bomo vklopili odlično orodje [Tracy |tracy:]. V načinu za razvijalce vizualizira napake, v produkcijskem načinu pa napake beleži v določen imenik: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Začasne datoteke .[#toc-temporary-files] Nette uporablja predpomnilnik za vsebnik DI, RobotLoader, predloge itd. Zato je treba nastaviti pot do imenika, v katerem bo shranjen predpomnilnik: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` V operacijskem sistemu Linux ali macOS nastavite [dovoljenja za pisanje za |nette:troubleshooting#Setting directory permissions] imenike `log/` in `temp/`. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Običajno bomo želeli samodejno naložiti razrede z [RobotLoaderjem |robot-loader:], zato ga moramo zagnati in mu omogočiti, da naloži razrede iz imenika, kjer se nahaja `Bootstrap.php` (tj. `__DIR__`), in vseh njegovih podimenikov: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Druga možnost je, da uporabimo samo samodejno nalaganje [Composer |best-practic Configurator vam omogoča, da določite časovni pas za svojo aplikacijo. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ V razvojnem načinu se vsebnik samodejno posodobi vsakič, ko spremenite kodo al Konfiguracijske datoteke se naložijo z uporabo `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Metodo `addConfig()` lahko za dodajanje več datotek pokličete večkrat. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Statični parametri .[#toc-static-parameters] Parametre, ki se uporabljajo v konfiguracijskih datotekah, je mogoče opredeliti [v razdelku `parameters` |dependency-injection:configuration#parameters] in jih tudi posredovati (ali prepisati) z metodo `addStaticParameters()` (ima vzdevek `addParameters()`). Pomembno je, da različne vrednosti parametrov povzročijo generiranje dodatnih vsebnikov DI, tj. dodatnih razredov. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Dinamični parametri .[#toc-dynamic-parameters] Kontejnerju lahko dodamo tudi dinamične parametre, katerih različne vrednosti za razliko od statičnih parametrov ne bodo povzročile generiranja novih DI kontejnerjev. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Spremenljivke okolja bi lahko preprosto dali na voljo z dinamičnimi parametri. Do njih lahko dostopamo prek spletne strani `%env.variable%` v konfiguracijskih datotekah. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Ustvarite nov primerek in ga vstavite v bootstrap: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Različna okolja .[#toc-different-environments] ============================================== -Razred `Bootstrap` lahko prilagodite svojim potrebam. Metodi `boot()` lahko dodate parametre za razlikovanje med spletnimi projekti ali dodate druge metode, kot so `bootForTests()`, ki inicializira okolje za teste enote, `bootForCli()` za skripte, ki se kličejo iz ukazne vrstice, in tako naprej. +Ne oklevajte, če želite razred `Bootstrap` prilagoditi svojim potrebam. Metodi `bootWebApplication()` lahko dodate parametre za razlikovanje med spletnimi projekti. Lahko pa dodate tudi druge metode, na primer `bootTestEnvironment()` za inicializacijo okolja za teste enote, `bootConsoleApplication()` za skripte, ki se kličejo iz ukazne vrstice, in tako naprej. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container { - $configurator = self::boot(); Tester\Environment::setup(); // Inicializacija Nette Testerja - return $configurator; + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container +{ + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/tr/bootstrap.texy b/application/tr/bootstrap.texy index 89a829e55b..1513e7fe3a 100644 --- a/application/tr/bootstrap.texy +++ b/application/tr/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Yapılandırıcı, uygulama ortamını ve hizmetlerini ayarlamaktan sorumludur. + $this->configurator = new Configurator; + // Nette tarafından oluşturulan geçici dosyalar için dizini ayarlayın (örn. derlenmiş şablonlar) + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette akıllıdır ve geliştirme modu otomatik olarak açılır, + // ya da aşağıdaki satırın yorumunu kaldırarak belirli bir IP adresi için etkinleştirebilirsiniz: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Tracy'yi etkinleştirir: nihai "İsviçre çakısı" hata ayıklama aracı. + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: verilen dizindeki tüm sınıfları otomatik yükler + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Yapılandırma dosyalarını yükle + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -Web uygulamaları söz konusu olduğunda, başlangıç dosyası `index.php` olup `www/` genel dizininde bulunur. Ortamı başlatmak için `Bootstrap` sınıfına izin verir ve DI konteynerini oluşturan `$configurator` sınıfını döndürür. Daha sonra web uygulamasını çalıştıran `Application` hizmetini elde eder: +Web uygulamaları için başlangıç dosyası `index.php`, `www/` genel dizininde bulunur. Ortamı başlatmak ve bir DI konteyneri oluşturmak için `Bootstrap` sınıfını kullanır. Ardından, web uygulamasını başlatan kapsayıcıdan `Application` hizmetini alır: ```php -// ortamı başlat + Configurator nesnesini al -$configurator = App\Bootstrap::boot(); -// bir DI konteyneri oluşturun -$container = $configurator->createContainer(); -// DI container bir Nette\Application\Application nesnesi oluşturur +$bootstrap = new App\Bootstrap; +// Ortamı başlatma + bir DI konteyneri oluşturma +$container = $bootstrap->bootWebApplication(); +// DI konteyneri bir Nette\Application\Application nesnesi oluşturur $application = $container->getByType(Nette\Application\Application::class); -// Nette uygulamasını başlat +// Nette uygulamasını başlatın ve gelen isteği işleyin $application->run(); ``` @@ -66,19 +91,19 @@ Mod seçimi otomatik algılama ile yapılır, bu nedenle genellikle herhangi bir Geliştirme modunu diğer durumlarda, örneğin belirli bir IP adresinden erişen programcılar için etkinleştirmek istiyorsanız, `setDebugMode()` adresini kullanabilirsiniz: ```php -$configurator->setDebugMode('23.75.345.200'); // bir veya daha fazla IP adresi +$this->configurator->setDebugMode('23.75.345.200'); // bir veya daha fazla IP adresi ``` Bir IP adresini bir çerezle birleştirmenizi kesinlikle öneririz. `nette-debug` çerezine gizli bir belirteç depolayacağız, örneğin `secret1234` ve geliştirme modu, bu IP ve çerez kombinasyonuna sahip programcılar için etkinleştirilecektir. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Ayrıca localhost için bile geliştirici modunu tamamen kapatabiliriz: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` `true` değerinin, bir üretim sunucusunda asla gerçekleşmemesi gereken geliştirici modunu zorlayarak açtığını unutmayın. @@ -90,7 +115,7 @@ Hata Ayıklama Aracı Tracy .[#toc-debugging-tool-tracy] Kolay hata ayıklama için harika araç [Tracy'yi |tracy:] açacağız. Geliştirici modunda hataları görselleştirir ve üretim modunda hataları belirtilen dizine kaydeder: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ Geçici Dosyalar .[#toc-temporary-files] Nette, DI konteyneri, RobotLoader, şablonlar vb. için önbelleği kullanır. Bu nedenle, önbelleğin depolanacağı dizinin yolunu ayarlamak gerekir: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` Linux veya macOS üzerinde, `log/` ve `temp/` dizinleri için [yazma izinlerini |nette:troubleshooting#Setting directory permissions] ayarlayın. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Genellikle, [RobotLoader'ı |robot-loader:] kullanarak sınıfları otomatik olarak yüklemek isteyeceğiz, bu yüzden onu başlatmalı ve `Bootstrap.php` 'un bulunduğu dizinden (yani `__DIR__`) ve tüm alt dizinlerinden sınıfları yüklemesine izin vermeliyiz: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ Zaman Dilimi .[#toc-timezone] Yapılandırıcı, uygulamanız için bir saat dilimi belirlemenize olanak tanır. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ Geliştirme modunda, kodu veya yapılandırma dosyalarını her değiştirdiğin Yapılandırma dosyaları `addConfig()` kullanılarak yüklenir: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Birden fazla dosya eklemek için `addConfig()` yöntemi birden fazla kez çağrılabilir. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ Statik Parametreler .[#toc-static-parameters] Yapılandırma dosyalarında kullanılan parametreler [`parameters` bölümünde |dependency-injection:configuration#parameters] tanımlanabilir ve ayrıca `addStaticParameters()` yöntemi ( `addParameters()` takma adı vardır) tarafından geçirilebilir (veya üzerine yazılabilir). Farklı parametre değerlerinin ek DI konteynerlerinin, yani ek sınıfların oluşturulmasına neden olması önemlidir. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ Dinamik Parametreler .[#toc-dynamic-parameters] Konteynere dinamik parametreler de ekleyebiliriz, statik parametrelerin aksine farklı değerleri yeni DI konteynerlerinin oluşturulmasına neden olmaz. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Ortam değişkenleri dinamik parametreler kullanılarak kolayca kullanılabilir hale getirilebilir. Bunlara yapılandırma dosyalarındaki `%env.variable%` adresinden erişebiliriz. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Yeni bir örnek oluşturun ve bootstrap'e ekleyin: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Farklı Ortamlar .[#toc-different-environments] ============================================== -`Bootstrap` sınıfını ihtiyaçlarınıza göre özelleştirmekten çekinmeyin. Web projelerini farklılaştırmak için `boot()` yöntemine parametreler ekleyebilir veya birim testleri için ortamı başlatan `bootForTests()`, komut satırından çağrılan komut dosyaları için `bootForCli()` gibi başka yöntemler ekleyebilirsiniz. + `Bootstrap` sınıfını ihtiyaçlarınıza göre özelleştirmekten çekinmeyin. Web projeleri arasında ayrım yapmak için `bootWebApplication()` yöntemine parametreler ekleyebilirsiniz. Alternatif olarak, birim testleri için ortamı başlatmak üzere `bootTestEnvironment()`, komut satırından çağrılan betikler için `bootConsoleApplication()` gibi başka yöntemler de ekleyebilirsiniz. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container +{ + Tester\Environment::setup(); // Nette Tester başlatma + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container { - $configurator = self::boot(); - Tester\Environment::setup(); // Nette Tester initialization - return $configurator; + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/application/uk/bootstrap.texy b/application/uk/bootstrap.texy index fa1a842ec0..aef63e390f 100644 --- a/application/uk/bootstrap.texy +++ b/application/uk/bootstrap.texy @@ -20,18 +20,44 @@ use Nette\Bootstrap\Configurator; class Bootstrap { - public static function boot(): Configurator + private Configurator $configurator; + private string $rootDir; + + public function __construct() + { + $this->rootDir = dirname(__DIR__); + // Конфігуратор відповідає за налаштування середовища та служб програми. + $this->configurator = new Configurator; + // Встановіть каталог для тимчасових файлів, що генеруються Nette (наприклад, скомпільовані шаблони) + $this->configurator->setTempDirectory($this->rootDir . '/temp'); + } + + public function bootWebApplication(): Nette\DI\Container { - $rootDir = dirname(__DIR__); - $configurator = new Configurator; - //$configurator->setDebugMode('secret@23.75.345.200'); - $configurator->enableTracy($rootDir . '/log'); - $configurator->setTempDirectory($rootDir . '/temp'); - $configurator->createRobotLoader() + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); + } + + private function initializeEnvironment(): void + { + // Nette розумний, і режим розробки вмикається автоматично, + // або ви можете увімкнути його для певної IP-адреси, не коментуючи наступний рядок: + // $this->configurator->setDebugMode('secret@23.75.345.200'); + + // Вмикає Tracy: найкращий інструмент налагодження "швейцарський армійський ніж". + $this->configurator->enableTracy($this->rootDir . '/log'); + + // RobotLoader: автозавантаження всіх класів у вказаному каталозі + $this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); - $configurator->addConfig($rootDir . '/config/common.neon'); - return $configurator; + } + + private function setupContainer(): void + { + // Завантажити конфігураційні файли + $this->configurator->addConfig($this->rootDir . '/config/common.neon'); } } ``` @@ -40,16 +66,15 @@ class Bootstrap index.php .[#toc-index-php] =========================== -У випадку веб-додатків початковим файлом є `index.php`, який знаходиться у загальнодоступному каталозі `www/`. Він дозволяє класу `Bootstrap` ініціалізувати середовище і повертає `$configurator`, який створює контейнер DI. Потім він отримує сервіс `Application`, який запускає веб-додаток: +Початковим файлом для веб-додатків є `index.php`, розташований у загальнодоступному каталозі `www/`. Він використовує клас `Bootstrap` для ініціалізації середовища і створення DI-контейнера. Потім він отримує сервіс `Application` з контейнера, який запускає веб-додаток: ```php -// ініціалізуємо середовище + отримуємо об'єкт Configurator -$configurator = App\Bootstrap::boot(); -// створюємо DI-контейнер -$container = $configurator->createContainer(); -// DI-контейнер створює об'єкт Nette\Application\Application +$bootstrap = new App\Bootstrap; +// Ініціалізація середовища + створення контейнера DI +$container = $bootstrap->bootWebApplication(); +// Контейнер DI створює об'єкт Nette\Application\Application $application = $container->getByType(Nette\Application\Application::class); -// запускаємо додаток Nette +// Запустіть додаток Nette та обробіть вхідний запит $application->run(); ``` @@ -66,19 +91,19 @@ Nette розрізняє два основні режими, в яких вик Якщо ви хочете ввімкнути режим розробки в інших випадках, наприклад, для програмістів, які отримують доступ з певної IP-адреси, ви можете використовувати `setDebugMode()`: ```php -$configurator->setDebugMode('23.75.345.200'); // одна або більше IP-адрес +$this->configurator->setDebugMode('23.75.345.200'); // одна або більше IP-адрес ``` Ми безумовно рекомендуємо поєднувати IP-адресу з файлом cookie. Ми зберігатимемо секретний токен у cookie `nette-debug', например, `secret1234`, і режим розробки буде активовано для програмістів із такою комбінацією IP і cookie. ```php -$configurator->setDebugMode('secret1234@23.75.345.200'); +$this->configurator->setDebugMode('secret1234@23.75.345.200'); ``` Можна повністю вимкнути режим розробника, навіть для localhost: ```php -$configurator->setDebugMode(false); +$this->configurator->setDebugMode(false); ``` Зверніть увагу, що значення `true` жорстко вмикає режим розробника, чого ніколи не повинно відбуватися на робочому сервері. @@ -90,7 +115,7 @@ $configurator->setDebugMode(false); Для полегшення налагодження ми увімкнемо чудовий інструмент [Tracy |tracy:]. У режимі розробника він візуалізує помилки, а в режимі виробництва - записує помилки в зазначений каталог: ```php -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->enableTracy($this->rootDir . '/log'); ``` @@ -100,7 +125,7 @@ $configurator->enableTracy($rootDir . '/log'); Nette використовує кеш для DI-контейнера, RobotLoader, шаблонів тощо. Тому необхідно задати шлях до директорії, де зберігатиметься кеш: ```php -$configurator->setTempDirectory($rootDir . '/temp'); +$this->configurator->setTempDirectory($this->rootDir . '/temp'); ``` У Linux або macOS встановіть [права на запис |nette:troubleshooting#Setting-Directory-Permissions] для каталогів `log/` і `temp/`. @@ -112,7 +137,7 @@ RobotLoader .[#toc-robotloader] Зазвичай ми хочемо автоматично завантажувати класи за допомогою [RobotLoader |robot-loader:], тому ми повинні запустити його і дозволити йому завантажити класи з каталогу, в якому знаходиться `Bootstrap.php` (тобто `__DIR__`) і всі його підкаталоги: ```php -$configurator->createRobotLoader() +$this->configurator->createRobotLoader() ->addDirectory(__DIR__) ->register(); ``` @@ -126,7 +151,7 @@ $configurator->createRobotLoader() Configurator дає змогу вказати часовий пояс для вашого застосунку. ```php -$configurator->setTimeZone('Europe/Prague'); +$this->configurator->setTimeZone('Europe/Prague'); ``` @@ -143,16 +168,17 @@ $configurator->setTimeZone('Europe/Prague'); Файли конфігурації завантажуються за допомогою `addConfig()`: ```php -$configurator->addConfig($rootDir . '/config/common.neon'); +$this->configurator->addConfig($this->rootDir . '/config/common.neon'); ``` Метод `addConfig()` може бути викликаний кілька разів для додавання декількох файлів. ```php -$configurator->addConfig($rootDir . '/config/common.neon'); -$configurator->addConfig($rootDir . '/config/services.neon'); +$configDir = $this->rootDir . '/config'; +$this->configurator->addConfig($configDir . '/common.neon'); +$this->configurator->addConfig($configDir . '/services.neon'); if (PHP_SAPI === 'cli') { - $configurator->addConfig($rootDir . '/config/cli.php'); + $this->configurator->addConfig($configDir . '/cli.php'); } ``` @@ -169,7 +195,7 @@ if (PHP_SAPI === 'cli') { Параметри, що використовуються у файлах конфігурації, можуть бути визначені [в секції `parameters` |dependency-injection:configuration#parameters] і підхоплені (або перезаписані) методом `addStaticParameters()` (у нього є аліас `addParameters()`). Важливо, що різні значення параметрів викликають генерацію додаткових DI-контейнерів, тобто додаткових класів. ```php -$configurator->addStaticParameters([ +$this->configurator->addStaticParameters([ 'projectId' => 23, ]); ``` @@ -183,7 +209,7 @@ $configurator->addStaticParameters([ Можна також додати динамічні параметри в контейнер. Їхні різні значення, на відміну від статичних параметрів, не призведуть до генерації нових DI-контейнерів. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'remoteIp' => $_SERVER['REMOTE_ADDR'], ]); ``` @@ -191,7 +217,7 @@ $configurator->addDynamicParameters([ Змінні середовища можуть бути легко доступні з використанням динамічних параметрів. Ми можемо отримати доступ до них через `%env.variable%` у файлах конфігурації. ```php -$configurator->addDynamicParameters([ +$this->configurator->addDynamicParameters([ 'env' => getenv(), ]); ``` @@ -226,7 +252,7 @@ services: Створюємо новий екземпляр і вставляємо його в Bootstrap: ```php -$configurator->addServices([ +$this->configurator->addServices([ 'myservice' => new App\Model\MyCustomService('foobar'), ]); ``` @@ -235,13 +261,21 @@ $configurator->addServices([ Різні середовища .[#toc-different-environments] =============================================== -Не соромтеся налаштувати клас `Bootstrap` відповідно до ваших потреб. Ви можете додавати параметри до методу `boot()` для розділення веб-проєктів, або додавати інші методи, як-от `bootForTests()`, які ініціалізують середовище для модульних тестів, `bootForCli()` для скриптів, що викликаються з командного рядка, і так далі. +Не соромтеся налаштовувати клас `Bootstrap` відповідно до ваших потреб. Ви можете додати параметри до методу `bootWebApplication()`, щоб розрізняти веб-проекти. Крім того, ви можете додати інші методи, такі як `bootTestEnvironment()` для ініціалізації середовища для модульних тестів, `bootConsoleApplication()` для скриптів, що викликаються з командного рядка, і так далі. ```php -public static function bootForTests(): Configurator +public function bootTestEnvironment(): Nette\DI\Container +{ + Tester\Environment::setup(); // Ініціалізація Nette Tester + $this->setupContainer(); + return $this->configurator->createContainer(); +} + +public function bootConsoleApplication(): Nette\DI\Container { - $configurator = self::boot(); - Tester\Environment::setup(); // Инициализация Nette Tester - return $configurator; + $this->configurator->setDebugMode(false); + $this->initializeEnvironment(); + $this->setupContainer(); + return $this->configurator->createContainer(); } ``` diff --git a/quickstart/bg/@home.texy b/quickstart/bg/@home.texy index 7938c891e0..f7bec3d2ea 100644 --- a/quickstart/bg/@home.texy +++ b/quickstart/bg/@home.texy @@ -88,8 +88,7 @@ Tracy (дебъгер) .[#toc-tracy-debugger] ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/cs/@home.texy b/quickstart/cs/@home.texy index e8b7683edd..83220197bc 100644 --- a/quickstart/cs/@home.texy +++ b/quickstart/cs/@home.texy @@ -88,8 +88,7 @@ V produkčním módu je Tracy samozřejmě vypnuta a nezobrazuje žádné citliv ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/de/@home.texy b/quickstart/de/@home.texy index 29ca05932a..61c7f0bea2 100644 --- a/quickstart/de/@home.texy +++ b/quickstart/de/@home.texy @@ -88,8 +88,7 @@ Im Produktionsmodus ist Tracy natürlich deaktiviert und gibt keine sensiblen In ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/el/@home.texy b/quickstart/el/@home.texy index eec7edaab8..7261b6a7cc 100644 --- a/quickstart/el/@home.texy +++ b/quickstart/el/@home.texy @@ -88,8 +88,7 @@ Tracy (αποσφαλματωτής) .[#toc-tracy-debugger] ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/en/@home.texy b/quickstart/en/@home.texy index 58e1528192..557b20c8cb 100644 --- a/quickstart/en/@home.texy +++ b/quickstart/en/@home.texy @@ -88,8 +88,7 @@ In the production mode, Tracy is, of course, disabled and does not reveal any se ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/es/@home.texy b/quickstart/es/@home.texy index 32e558a689..bfad494e54 100644 --- a/quickstart/es/@home.texy +++ b/quickstart/es/@home.texy @@ -88,8 +88,7 @@ En el modo de producción, Tracy está, por supuesto, desactivado y no revela ni ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/fr/@home.texy b/quickstart/fr/@home.texy index 5c68f72119..5e6ceaeb7e 100644 --- a/quickstart/fr/@home.texy +++ b/quickstart/fr/@home.texy @@ -88,8 +88,7 @@ En mode production, Tracy est, bien entendu, désactivé et ne révèle aucune i ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/hu/@home.texy b/quickstart/hu/@home.texy index 7bef01b7aa..eee76cf4d6 100644 --- a/quickstart/hu/@home.texy +++ b/quickstart/hu/@home.texy @@ -88,8 +88,7 @@ Termelési üzemmódban a Tracy természetesen le van tiltva, és nem árul el s ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/it/@home.texy b/quickstart/it/@home.texy index 2a13625d21..61fdeeb289 100644 --- a/quickstart/it/@home.texy +++ b/quickstart/it/@home.texy @@ -88,8 +88,7 @@ In modalità di produzione, Tracy è ovviamente disattivato e non rivela alcuna ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/pl/@home.texy b/quickstart/pl/@home.texy index 945b081924..66f60870f7 100644 --- a/quickstart/pl/@home.texy +++ b/quickstart/pl/@home.texy @@ -88,8 +88,7 @@ Oczywiście w trybie produkcyjnym Tracy jest wyłączona i nie wyświetla żadny ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/pt/@home.texy b/quickstart/pt/@home.texy index db19054540..5a097ade02 100644 --- a/quickstart/pt/@home.texy +++ b/quickstart/pt/@home.texy @@ -88,8 +88,7 @@ No modo de produção, Tracy está, naturalmente, desativada e não revela nenhu ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/ro/@home.texy b/quickstart/ro/@home.texy index 3fad37b9fe..d8df6d0988 100644 --- a/quickstart/ro/@home.texy +++ b/quickstart/ro/@home.texy @@ -88,8 +88,7 @@ Tracy vă va ajuta în mod semnificativ în timpul vânătorii de erori. Reține ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/ru/@home.texy b/quickstart/ru/@home.texy index 57c90fd832..2efef9f2bc 100644 --- a/quickstart/ru/@home.texy +++ b/quickstart/ru/@home.texy @@ -88,8 +88,7 @@ Tracy существенно поможет вам в поиске ошибок. ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/sl/@home.texy b/quickstart/sl/@home.texy index 4eb8c41cf2..de950f0bcc 100644 --- a/quickstart/sl/@home.texy +++ b/quickstart/sl/@home.texy @@ -88,8 +88,7 @@ V produkcijskem načinu je Tracy seveda onemogočen in ne razkriva nobenih obču ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/tr/@home.texy b/quickstart/tr/@home.texy index 75b9349a31..96f177f22a 100644 --- a/quickstart/tr/@home.texy +++ b/quickstart/tr/@home.texy @@ -88,8 +88,7 @@ Tracy, hataları ararken size önemli ölçüde yardımcı olacaktır. Ayrıca, ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ``` diff --git a/quickstart/uk/@home.texy b/quickstart/uk/@home.texy index ca976b7cc7..916b207e10 100644 --- a/quickstart/uk/@home.texy +++ b/quickstart/uk/@home.texy @@ -88,8 +88,7 @@ Tracy суттєво допоможе вам у пошуку помилок. Т ```php .{file:app/Bootstrap.php} ... -$configurator->setDebugMode(false); -$configurator->enableTracy($rootDir . '/log'); +$this->configurator->setDebugMode(false); ... ```