Bootstrap
Bootstrap е кодът на bootstrap, който инициализира средата, създава контейнера за изпълнение на зависимости (DI) и стартира приложението. Обсъждаме:
- Как да настроите приложение, използващо файлове NEON
- Как да работите с режими за производство и разработка
- Как да създадете контейнер DI
Приложенията, независимо дали са уеб приложения или скриптове от
команден ред, започват с инициализиране на средата под една или друга
форма. В древни времена за това може да е отговарял файл, наречен
например include.inc.php
, който е бил включен в изходния файл. В
съвременните приложения на Nette той е заменен с класа Bootstrap
, който
се намира като част от приложението във файла app/Bootstrap.php
. Това
може да изглежда например така:
index.php
В случая на уеб приложенията основният файл е index.php
, който се
намира в публичната директория
www/
. Това ще накара класа Bootstrap да инициализира средата и да
създаде контейнер DI. След това той получава от него услугата
Application
, която стартира уеб приложението:
Както виждате, класът Nette\Bootstrap\Configurator, който сега ще представим по-подробно, помага при настройването на средата и създаването на контейнера за инжектиране на зависимости (DI).
Режим на разработка и производствен режим
Nette се държи по различен начин в зависимост от това дали работи на сървър за разработка или на производствен сървър:
- 🛠️ Режим на разработка
- Показва лентата за отстраняване на грешки на Tracy с полезна информация (напр. SQL заявки, време за изпълнение, използване на памет).
- Показва подробна страница за грешки с проследяване на извикването на функциите и съдържанието на променливите, когато възникне грешка.
- Автоматично опреснява кеша, когато се променят шаблони на Latte, конфигурационни файлове и др.
- 🚀 Производствен режим
- Не показва никаква информация за отстраняване на грешки; всички грешки се записват в дневника.
- Показва
ErrorPresenter
или обща страница „Server Error“ (Грешка на сървъра), когато възникне грешка. - Кешът никога не се опреснява автоматично!
- Оптимизиран за скорост и сигурност.
Режимът се определя автоматично, така че в повечето случаи не е необходимо да го конфигурирате или превключвате ръчно:
- Режим на разработка: (IP адрес
127.0.0.1
или::1
), освен ако не се използва прокси сървър (т.е. въз основа на неговите HTTP заглавия). - Производствен режим: Активен навсякъде другаде.
Ако искате да активирате режима за разработка в други случаи,
например за програмисти, които имат достъп от определен IP адрес, можете
да използвате setDebugMode()
:
Определено препоръчваме да комбинирате IP адреса с „бисквитка“. Ще
съхраним тайния токен в „бисквитката“ nette-debug', например, `secret1234
,
а режимът за разработка ще бъде активиран за програмистите с тази
комбинация от IP и „бисквитка“.
Можете да деактивирате напълно режима за разработчици, дори за localhost:
Обърнете внимание, че стойността true
активира плътно режима за
разработчици, което никога не трябва да се случва на производствен
сървър.
Инструмент за отстраняване на грешки в Tracy
За да улесним дебъгването, ще включим чудесния инструмент Tracy. В режим за разработчици той визуализира грешките, а в производствен режим записва грешките в определена директория:
Временни файлове
Nette използва кеш за DI-контейнер, RobotLoader, шаблони и др. Затова е необходимо да се зададе пътят до директорията, в която се съхранява кешът:
В Linux или macOS задайте разрешения за запис за
директориите log/
и temp/
.
RobotLoader
Обикновено искаме да заредим класовете автоматично с помощта на RobotLoader, така че трябва да го стартираме и да му позволим
да зареди класовете от директорията, в която се намира Bootstrap.php
(т.е. __DIR__
) и всички негови поддиректории:
Алтернативен начин е да се използва само автозадаващото устройство PSR-4 Composer.
Часова зона
Конфигураторът ви позволява да зададете часовата зона за вашето приложение.
Конфигурация на DI-контейнер
Част от процеса на изтегляне е създаването на контейнера DI, т.е. фабриката за обекти, която е сърцето на цялото приложение. Всъщност това е клас на PHP, създаден от Nette и съхраняван в директория за кеш. Фабриката създава ключовите обекти на приложението, а конфигурационните файлове я инструктират как да ги създава и конфигурира, като по този начин влияем върху поведението на цялото приложение.
Файловете за конфигурация обикновено се записват във формат NEON. Можете да прочетете какво може да се конфигурира тук.
В режим на разработка контейнерът се актуализира автоматично при всяка промяна на кода или конфигурационните файлове. В производствен режим той се генерира само веднъж и промените във файловете не се проверяват за максимална производителност.
Файловете за конфигурация се зареждат с помощта на addConfig()
:
Методът addConfig()
може да се извика няколко пъти, за да се добавят
няколко файла.
Свързването cli.php
не е печатна грешка, конфигурацията може да
бъде записана и в PHP файл, който я връща като масив.
Като алтернатива можем да използваме раздела includes
за зареждане
на конфигурационни файлове.
Ако в конфигурационните файлове се появят елементи със същите
ключове, те ще бъдат презаписани или
обединени в случай на масиви. По-късно включен файл има по-висок
приоритет от предишния. Файлът, посочен в раздела includes
, има
по-висок приоритет от файловете, включени в него.
Статични параметри
Параметрите, използвани в конфигурационните файлове, могат да бъдат
дефинирани в раздела parameters
и да бъдат взети (или презаписани) от метода addStaticParameters()
(той има
псевдоним addParameters()
). Важно е, че различните стойности на
параметрите водят до генериране на допълнителни DI-контейнери, т.е.
допълнителни класове.
В конфигурационните файлове можем да запишем обичайната нотация
%projectId%
, за да получим достъп до параметъра с име projectId
.
Динамични параметри
Възможно е също така да се добавят динамични параметри към контейнер. Различните им стойности, за разлика от статичните параметри, не генерират нови контейнери DI.
Достъпът до променливите на средата е лесен с помощта на динамични
параметри. Достъпът до тях се осъществява чрез %env.variable%
в
конфигурационните файлове.
Параметри по подразбиране
Можете да използвате следните статични параметри в конфигурационните файлове:
%appDir%
е абсолютният път до директорията на файлаBootstrap.php
%wwwDir%
е абсолютният път до директорията, съдържаща входния файлindex.php
%tempDir%
е абсолютният път до директорията за временни файлове%vendorDir%
е абсолютният път до директорията, в която Composer инсталира библиотеки%rootDir%
е абсолютният път до главната директория на проекта%debugMode%
показва дали приложението е в режим на отстраняване на грешки%consoleMode%
показва дали заявката е постъпила от командния ред
Внесени услуги
Нека се задълбочим. Въпреки че целта на контейнера DI е да създава
обекти, може да се наложи в контейнера да се вмъкне съществуващ обект.
Това става чрез дефиниране на услуга с атрибута imported: true
:
Създайте нов екземпляр и го вмъкнете в Bootstrap:
Различни среди
Не се колебайте да персонализирате класа Bootstrap
според нуждите
си. Можете да добавите параметри към метода bootWebApplication()
, за да
разграничите отделните уеб проекти. Като алтернатива можете да
добавите и други методи, например bootTestEnvironment()
за инициализиране
на средата за unit тестове, bootConsoleApplication()
за скриптове, извикани от
командния ред, и т.н.