Nette Documentation Preview

syntax
Глосарій термінів
*****************


AJAX .[#toc-ajax]
-----------------
Асинхронний JavaScript і XML - технологія взаємодії клієнта і сервера за протоколом HTTP без необхідності перезавантаження всієї сторінки при кожному запиті. Незважаючи на абревіатуру, формат [JSON |#JSON] часто використовують замість XML.


Дія презентера .[#toc-presenter-action]
---------------------------------------
Логічна частина [presenter |#presenter], що виконує одну дію, наприклад, показати сторінку продукту, виписати користувача тощо. В одного презентера може бути кілька дій.


BOM
---
Так звана *маска порядку байтів* - це спеціальний перший символ файлу, який вказує порядок байтів у кодуванні. Деякі редактори вмикають його автоматично, він практично непомітний, але він спричиняє проблеми із заголовками та надсиланням виводу з PHP. Для масового видалення можна використовувати [Code Checker |code-checker:].


Контролер .[#toc-controller]
----------------------------
Контролер обробляє запити від користувача і на їхній основі викликає певну логіку застосунку (тобто [Модель |#Модель]), потім він викликає [Вигляд |#Вид] для рендерингу даних. Аналогом контролерів у фреймворку Nette є [презентери |#Presenter].


Міжсайтовий скриптинг (XSS) .[#toc-cross-site-scripting-xss]
------------------------------------------------------------
Міжсайтовий скриптинг - це метод порушення роботи сайту з використанням неекранованого введення. Зловмисник може впровадити свій власний код HTML або JavaScript і змінити зовнішній вигляд сторінки або навіть зібрати конфіденційну інформацію про користувачів. Захист від XSS простий: послідовне і правильне екранування всіх рядків і даних, що вводяться.

Nette Framework пропонує абсолютно нову технологію [Context-Aware Escaping |latte:safety-first#Context-Aware-Escaping], яка назавжди позбавить вас від ризиків міжсайтового скриптингу. Він автоматично екранує всі дані, що вводяться, ґрунтуючись на заданому контексті, тому кодер не зможе випадково щось забути.


Підробка міжсайтових запитів (CSRF) .[#toc-cross-site-request-forgery-csrf]
---------------------------------------------------------------------------
Атака Cross-Site Request Forgery полягає в тому, що зловмисник заманює жертву відвідати сторінку, яка мовчки виконує запит у браузері жертви до сервера, на якому жертва на даний момент зареєстрована, і сервер вважає, що запит був зроблений жертвою за власним бажанням. Сервер виконує певну дію під особистістю жертви, але без її відома. Це може бути зміна або видалення даних, надсилання повідомлення тощо.

Nette Framework **автоматично захищає форми та сигнали в презентаторах** від цього типу атак. Це робиться шляхом запобігання їхнього надсилання або виклику з іншого домену.


Ін'єкція залежностей .[#toc-dependency-injection]
-------------------------------------------------
Ін'єкція залежностей (Dependency Injection, DI) - це патерн проектування, який показує, як відокремити створення об'єктів від їхніх залежностей. Тобто клас не відповідає за створення або ініціалізацію своїх залежностей, натомість ці залежності надаються зовнішнім кодом (який може містити контейнер [DI |#Dependency Injection container]). Перевага полягає в тому, що це забезпечує більшу гнучкість коду, кращу читабельність і легше тестування додатків, оскільки залежності легко замінюються та ізолюються від інших частин коду. Для отримання додаткової інформації див. статтю [Що таке ін'єкція залежностей? |dependency-injection:introduction]


Контейнер Dependency Injection .[#toc-dependency-injection-container]
---------------------------------------------------------------------
Контейнер Dependency Injection (також DI-контейнер або IoC-контейнер) - це інструмент для створення та управління залежностями в додатку (або [сервісах |#service]). Контейнер зазвичай має конфігурацію, яка визначає, які класи залежать від інших класів, які конкретні реалізації залежностей використовувати і як створювати ці залежності. Потім контейнер створює ці об'єкти і надає їх класам, які їх потребують. Для отримання додаткової інформації див. статтю [Що таке DI-контейнер? |dependency-injection:container]


Екранування .[#toc-escaping]
----------------------------
Екранування - це перетворення символів, що мають особливе значення в даному контексті, в інші еквівалентні послідовності. Приклад: Ми хочемо записати лапки в укладений у лапки рядок. Оскільки лапки мають особливе значення в контексті укладеного в лапки рядка, необхідно використовувати іншу еквівалентну послідовність. Конкретна послідовність визначається правилами контексту (наприклад, `\"` в укладеному в лапки рядку PHP, `"` в атрибутах HTML тощо).


Фільтр .[#toc-filter-formerly-helper]
-------------------------------------
Функція фільтрації. У шаблонах [filter |latte:syntax#Filters] - це функція, яка допомагає змінити або відформатувати дані у вихідну форму. У шаблонах зумовлено кілька [стандартних фільтрів |latte:filters].


Інвалідація .[#toc-invalidation]
--------------------------------
Повідомлення про [сніпет |#SameSite-Cookie] для повторного рендерингу. В іншому контексті також очищення кешу.


JSON .[#toc-json]
-----------------
Формат обміну даними, заснований на синтаксисі JavaScript (це його підмножина). Точну специфікацію можна знайти на сайті www.json.org.


Компонент .[#toc-component]
---------------------------
Багаторазово використовувана частина програми. Це може бути візуальна частина сторінки, як описано в розділі [application:components], або цей термін може також позначати клас [Component |component-model:] (такий компонент не обов'язково має бути візуальним).


Керівні символи .[#toc-control-characters]
------------------------------------------
Керуючі символи - це невидимі символи, які можуть зустрічатися в тексті та зрештою спричиняти деякі проблеми. Для їх масового видалення з файлів можна використовувати [Code Checker |code-checker:], для видалення зі змінної - функцію [Strings::normalize() |utils:strings#normalize].


Події .[#toc-events]
--------------------
Подія - це очікувана ситуація в об'єкті, при виникненні якої викликаються так звані обробники, тобто зворотні виклики, що реагують на подію ("зразок":https://gist.github.com/dg/332cdd51bdf7d66a6d8003b134508a38). Подією може бути, наприклад, відправлення форми, вхід користувача в систему тощо. Таким чином, події є формою *інверсії управління*.

Наприклад, вхід користувача в систему відбувається в методі `Nette\Security\User::login()`. Об'єкт `User` має публічну змінну `$onLoggedIn`, що являє собою масив, у який кожен може додати зворотний виклик. Щойно користувач входить у систему, метод `login()` викликає всі зворотні виклики в масиві. Ім'я змінної у формі `onXyz` - це угода, яка використовується в усьому Nette.


Latte .[#toc-latte]
-------------------
Одна з найбільш інноваційних [систем шаблонування |latte:] за всю історію.


Модель .[#toc-model]
--------------------
Модель являє собою дані та функціональну основу всього додатка. Вона включає в себе всю логіку програми (іноді також звану "бізнес-логікою"). Це **M** з **M**VC або MPV. Будь-яка дія користувача (вхід у систему, поміщення товару в кошик, зміна значення бази даних) являє собою дію моделі.

Модель керує своїм внутрішнім станом і надає публічний інтерфейс. Викликаючи цей інтерфейс, ми можемо приймати або змінювати його стан. Модель не знає про існування [Виду |#Вид] або [Контролера |#Controller], вона повністю незалежна від них.


Модель-Вид-Контролер (MVC) .[#toc-model-view-controller]
--------------------------------------------------------
Архітектура програмного забезпечення, що виникла під час розроблення GUI-додатків для відокремлення коду керування потоком ([Контролер |#Контроллер]) від коду логіки додатка ([Модель |#Модель]) та від коду візуалізації даних ([Вид |#Вид]). Таким чином, код стає зрозумілішим, це полегшує майбутню розробку і дає змогу тестувати окремі частини окремо.


Модель-Вид-Презентер (MVP) .[#toc-model-view-presenter]
-------------------------------------------------------
Архітектура, заснована на [Модель-Вид-Контролер (MVC) |#Модель-Вид-Контроллер (MVC)].


Модуль .[#toc-module]
---------------------
Модуль у фреймворку Nette являє собою набір презентерів і шаблонів, в кінцевому підсумку також компонентів і моделей, які слугують даними для презентера. Таким чином, це певна логічна частина програми.

Наприклад, електронний магазин може складатися з трьох модулів:
1) Каталог товарів із кошиком.
2) Адміністрування для клієнта.
3) Адміністрування для власника магазину.


Простір імен .[#toc-namespace]
------------------------------
Простір імен є особливістю мови PHP, починаючи з версії 5.3, а також деяких інших мов програмування. Це допомагає уникнути зіткнень імен (наприклад, два класи з однаковим ім'ям) при спільному використанні різних бібліотек. Більш детальну інформацію дивіться в [документації PHP |https://www.php.net/manual/ru/language.namespaces.rationale.php].


Презентер .[#toc-presenter]
---------------------------
Презентер - це об'єкт, який приймає [запит |api:Nette\Application\Request], перекладений маршрутизатором з HTTP-запиту, і генерує [відповідь |api:Nette\Application\Response]. Відповіддю може бути HTML-сторінка, картинка, XML-документ, файл, JSON, перенаправлення або все, що ви придумаєте.

Під презентером зазвичай мається на увазі нащадок класу [api:Nette\Application\UI\Presenter]. За запитами він виконує відповідні [дії |application:presenters#Life-Cycle-of-Presenter] та рендерить шаблони.


Роутер .[#toc-router]
---------------------
Двонаправлений перекладач між HTTP-запитом / URL і дією презентера. Двоспрямованість означає, що можна не тільки отримати [Дію презентера |#Действие презентера] з HTTP-запиту, а й згенерувати відповідний URL для дії. Див. докладніше в розділі про [URL-маршрутизацію |application:routing].


SameSite Cookie .[#toc-samesite-cookie]
---------------------------------------
Файли cookie SameSite забезпечують механізм розпізнавання того, що призвело до завантаження сторінки. Він може мати три значення: `Lax`, `Strict` і `None` (останнє вимагає HTTPS). Якщо запит на сторінку надходить безпосередньо з сайту або користувач відкриває сторінку, вводячи адресу безпосередньо в адресному рядку або натискаючи на закладку, браузер відправляє всі файли cookie на сервер (тобто з прапорами `Lax`, `Strict` і `None`). Якщо користувач переходить на сайт за посиланням з іншого сайту, на сервер передаються файли cookie з прапорами `Lax` і `None`. Якщо запит здійснюється іншими способами, наприклад, відправка POST-форми з іншого сайту, завантаження в iframe, використання JavaScript і т.д., надсилаються тільки файли cookie з прапором `None`.


Сервіс .[#toc-service]
----------------------
В контексті Dependency Injection, сервіс - це об'єкт, який створюється і управляється контейнером DI. Сервіс можна легко замінити іншою реалізацією, наприклад, для тестування або зміни поведінки програми, без необхідності змінювати код, який використовує сервіс.


Фрагмент .[#toc-snippet]
------------------------
Фрагмент сторінки, який можна окремо відрендерити під час [AJAX-запиту |#AJAX].


Вигляд .[#toc-view]
-------------------
Представлення - це рівень додатку, який відповідає за відображення результатів запиту. Зазвичай він використовує систему шаблонів і знає, як відображати свої компоненти або результати, взяті з моделі.



{{leftbar: www:@menu-common}}
{{priority: -2}}

Глосарій термінів

AJAX

Асинхронний JavaScript і XML – технологія взаємодії клієнта і сервера за протоколом HTTP без необхідності перезавантаження всієї сторінки при кожному запиті. Незважаючи на абревіатуру, формат JSON часто використовують замість XML.

Дія презентера

Логічна частина presenter, що виконує одну дію, наприклад, показати сторінку продукту, виписати користувача тощо. В одного презентера може бути кілька дій.

BOM

Так звана маска порядку байтів – це спеціальний перший символ файлу, який вказує порядок байтів у кодуванні. Деякі редактори вмикають його автоматично, він практично непомітний, але він спричиняє проблеми із заголовками та надсиланням виводу з PHP. Для масового видалення можна використовувати Code Checker.

Контролер

Контролер обробляє запити від користувача і на їхній основі викликає певну логіку застосунку (тобто Модель), потім він викликає Вигляд для рендерингу даних. Аналогом контролерів у фреймворку Nette є презентери.

Міжсайтовий скриптинг (XSS)

Міжсайтовий скриптинг – це метод порушення роботи сайту з використанням неекранованого введення. Зловмисник може впровадити свій власний код HTML або JavaScript і змінити зовнішній вигляд сторінки або навіть зібрати конфіденційну інформацію про користувачів. Захист від XSS простий: послідовне і правильне екранування всіх рядків і даних, що вводяться.

Nette Framework пропонує абсолютно нову технологію Context-Aware Escaping, яка назавжди позбавить вас від ризиків міжсайтового скриптингу. Він автоматично екранує всі дані, що вводяться, ґрунтуючись на заданому контексті, тому кодер не зможе випадково щось забути.

Підробка міжсайтових запитів (CSRF)

Атака Cross-Site Request Forgery полягає в тому, що зловмисник заманює жертву відвідати сторінку, яка мовчки виконує запит у браузері жертви до сервера, на якому жертва на даний момент зареєстрована, і сервер вважає, що запит був зроблений жертвою за власним бажанням. Сервер виконує певну дію під особистістю жертви, але без її відома. Це може бути зміна або видалення даних, надсилання повідомлення тощо.

Nette Framework автоматично захищає форми та сигнали в презентаторах від цього типу атак. Це робиться шляхом запобігання їхнього надсилання або виклику з іншого домену.

Ін'єкція залежностей

Ін'єкція залежностей (Dependency Injection, DI) – це патерн проектування, який показує, як відокремити створення об'єктів від їхніх залежностей. Тобто клас не відповідає за створення або ініціалізацію своїх залежностей, натомість ці залежності надаються зовнішнім кодом (який може містити контейнер DI). Перевага полягає в тому, що це забезпечує більшу гнучкість коду, кращу читабельність і легше тестування додатків, оскільки залежності легко замінюються та ізолюються від інших частин коду. Для отримання додаткової інформації див. статтю Що таке ін'єкція залежностей?

Контейнер Dependency Injection

Контейнер Dependency Injection (також DI-контейнер або IoC-контейнер) – це інструмент для створення та управління залежностями в додатку (або сервісах). Контейнер зазвичай має конфігурацію, яка визначає, які класи залежать від інших класів, які конкретні реалізації залежностей використовувати і як створювати ці залежності. Потім контейнер створює ці об'єкти і надає їх класам, які їх потребують. Для отримання додаткової інформації див. статтю Що таке DI-контейнер?

Екранування

Екранування – це перетворення символів, що мають особливе значення в даному контексті, в інші еквівалентні послідовності. Приклад: Ми хочемо записати лапки в укладений у лапки рядок. Оскільки лапки мають особливе значення в контексті укладеного в лапки рядка, необхідно використовувати іншу еквівалентну послідовність. Конкретна послідовність визначається правилами контексту (наприклад, \" в укладеному в лапки рядку PHP, " в атрибутах HTML тощо).

Фільтр

Функція фільтрації. У шаблонах filter – це функція, яка допомагає змінити або відформатувати дані у вихідну форму. У шаблонах зумовлено кілька стандартних фільтрів.

Інвалідація

Повідомлення про сніпет для повторного рендерингу. В іншому контексті також очищення кешу.

JSON

Формат обміну даними, заснований на синтаксисі JavaScript (це його підмножина). Точну специфікацію можна знайти на сайті www.json.org.

Компонент

Багаторазово використовувана частина програми. Це може бути візуальна частина сторінки, як описано в розділі components, або цей термін може також позначати клас Component (такий компонент не обов'язково має бути візуальним).

Керівні символи

Керуючі символи – це невидимі символи, які можуть зустрічатися в тексті та зрештою спричиняти деякі проблеми. Для їх масового видалення з файлів можна використовувати Code Checker, для видалення зі змінної – функцію Strings::normalize().

Події

Подія – це очікувана ситуація в об'єкті, при виникненні якої викликаються так звані обробники, тобто зворотні виклики, що реагують на подію (зразок). Подією може бути, наприклад, відправлення форми, вхід користувача в систему тощо. Таким чином, події є формою інверсії управління.

Наприклад, вхід користувача в систему відбувається в методі Nette\Security\User::login(). Об'єкт User має публічну змінну $onLoggedIn, що являє собою масив, у який кожен може додати зворотний виклик. Щойно користувач входить у систему, метод login() викликає всі зворотні виклики в масиві. Ім'я змінної у формі onXyz – це угода, яка використовується в усьому Nette.

Latte

Одна з найбільш інноваційних систем шаблонування за всю історію.

Модель

Модель являє собою дані та функціональну основу всього додатка. Вона включає в себе всю логіку програми (іноді також звану „бізнес-логікою“). Це M з MVC або MPV. Будь-яка дія користувача (вхід у систему, поміщення товару в кошик, зміна значення бази даних) являє собою дію моделі.

Модель керує своїм внутрішнім станом і надає публічний інтерфейс. Викликаючи цей інтерфейс, ми можемо приймати або змінювати його стан. Модель не знає про існування Виду або Контролера, вона повністю незалежна від них.

Модель-Вид-Контролер (MVC)

Архітектура програмного забезпечення, що виникла під час розроблення GUI-додатків для відокремлення коду керування потоком (Контролер) від коду логіки додатка (Модель) та від коду візуалізації даних (Вид). Таким чином, код стає зрозумілішим, це полегшує майбутню розробку і дає змогу тестувати окремі частини окремо.

Модель-Вид-Презентер (MVP)

Архітектура, заснована на Модель-Вид-Контролер (MVC).

Модуль

Модуль у фреймворку Nette являє собою набір презентерів і шаблонів, в кінцевому підсумку також компонентів і моделей, які слугують даними для презентера. Таким чином, це певна логічна частина програми.

Наприклад, електронний магазин може складатися з трьох модулів:

  1. Каталог товарів із кошиком.
  2. Адміністрування для клієнта.
  3. Адміністрування для власника магазину.

Простір імен

Простір імен є особливістю мови PHP, починаючи з версії 5.3, а також деяких інших мов програмування. Це допомагає уникнути зіткнень імен (наприклад, два класи з однаковим ім'ям) при спільному використанні різних бібліотек. Більш детальну інформацію дивіться в документації PHP.

Презентер

Презентер – це об'єкт, який приймає запит, перекладений маршрутизатором з HTTP-запиту, і генерує відповідь. Відповіддю може бути HTML-сторінка, картинка, XML-документ, файл, JSON, перенаправлення або все, що ви придумаєте.

Під презентером зазвичай мається на увазі нащадок класу Nette\Application\UI\Presenter. За запитами він виконує відповідні дії та рендерить шаблони.

Роутер

Двонаправлений перекладач між HTTP-запитом / URL і дією презентера. Двоспрямованість означає, що можна не тільки отримати Дію презентера з HTTP-запиту, а й згенерувати відповідний URL для дії. Див. докладніше в розділі про URL-маршрутизацію.

Файли cookie SameSite забезпечують механізм розпізнавання того, що призвело до завантаження сторінки. Він може мати три значення: Lax, Strict і None (останнє вимагає HTTPS). Якщо запит на сторінку надходить безпосередньо з сайту або користувач відкриває сторінку, вводячи адресу безпосередньо в адресному рядку або натискаючи на закладку, браузер відправляє всі файли cookie на сервер (тобто з прапорами Lax, Strict і None). Якщо користувач переходить на сайт за посиланням з іншого сайту, на сервер передаються файли cookie з прапорами Lax і None. Якщо запит здійснюється іншими способами, наприклад, відправка POST-форми з іншого сайту, завантаження в iframe, використання JavaScript і т.д., надсилаються тільки файли cookie з прапором None.

Сервіс

В контексті Dependency Injection, сервіс – це об'єкт, який створюється і управляється контейнером DI. Сервіс можна легко замінити іншою реалізацією, наприклад, для тестування або зміни поведінки програми, без необхідності змінювати код, який використовує сервіс.

Фрагмент

Фрагмент сторінки, який можна окремо відрендерити під час AJAX-запиту.

Вигляд

Представлення – це рівень додатку, який відповідає за відображення результатів запиту. Зазвичай він використовує систему шаблонів і знає, як відображати свої компоненти або результати, взяті з моделі.