Словарь терминов
AJAX
Asynchronous JavaScript and XML – технология обмена сведениями между клиентом и сервером по протоколу HTTP без необходимости перезагружать всю страницу при каждом запросе. Хотя название может наводить на мысль, что данные отправляются только в формате XML, обычно используется и формат JSON.
Действие презентера
Логическая часть презентера, которая выполняет одно действие. Например, показывает страницу товара, разлогинивает пользователя и т. п. У одного презентера может быть несколько действий.
BOM
Byte order mark – особый первый символ в файле, служащий указателем порядка байтов в кодировке. Некоторые редакторы вставляют его в файлы. Он практически невидим, но вызывает проблемы с отправкой вывода и заголовков из PHP. Для массового удаления можно использовать Code Checker.
Контроллер
Контроллер обрабатывает запросы пользователя и на их основе вызывает подходящую логику приложения (то есть модель), а затем просит представление отрисовать данные. Эквивалент контроллеров в Nette Framework – презентеры.
Cross-Site Scripting (XSS)
Cross-Site Scripting – способ нарушения работы сайтов, использующий неэкранированный вывод. Злоумышленник может внедрить в страницу собственный код и тем самым изменить страницу или даже получить конфиденциальные данные о посетителях. Защита от XSS состоит в последовательном и правильном экранировании всех выводимых строк.
Nette Framework привносит революционную технологию контекстно-зависимого экранирования, которая навсегда устраняет риск Cross-Site Scripting. Она автоматически экранирует все выводы, так что разработчик ничего не может забыть.
Cross-Site Request Forgery (CSRF)
Атака Cross-Site Request Forgery состоит в том, что злоумышленник заманивает жертву на страницу, которая незаметно выполняет в браузере жертвы запрос к серверу, где жертва авторизована. Сервер считает, что запрос жертва сделала по своей воле. Тем самым под личностью жертвы он выполняет действие без её ведома. Это может быть изменение или удаление данных, отправка сообщения и т. п.
Nette Framework автоматически защищает формы и сигналы в презентерах от атак этого типа, не позволяя отправлять или вызывать их с другого домена.
Cross-Origin Resource Sharing (CORS)
CORS – механизм безопасности, который позволяет веб-странице выполнять из JavaScript запросы к домену, отличному от того, с которого страница была загружена. Без CORS браузеры такие запросы из соображений безопасности блокируют.
Например, если ваш сайт работает по адресу https://myapp.com и
пытается через JavaScript (AJAX, Fetch API) получить данные с https://api.example.com,
браузер проверит, разрешает ли сервер API такой запрос с другого
источника. Сервер API должен ответить особыми HTTP-заголовками, например
Access-Control-Allow-Origin: https://myapp.com, чтобы дать разрешение.
Dependency Injection
Dependency Injection (DI), то есть внедрение зависимостей, – шаблон проектирования, который предписывает отделять создание объектов от их зависимостей. Это значит, что класс не отвечает за создание или инициализацию своих зависимостей; вместо этого зависимости предоставляет внешний код (которым может быть DI-контейнер). Преимущество в большей гибкости кода, лучшей понятности и более лёгком тестировании приложения, потому что зависимости легко заменить и они изолированы от других частей кода. Подробнее в главе Что такое Dependency Injection?
Dependency Injection Container
Контейнер внедрения зависимостей (он же DI-контейнер или IoC-контейнер) – инструмент, который занимается созданием зависимостей (или сервисов) в приложении и управлением ими. У контейнера обычно есть конфигурация, определяющая, какие классы зависят от других, какие конкретные реализации зависимостей нужно использовать и как эти зависимости создавать. Контейнер затем создаёт эти объекты и предоставляет их классам, которым они нужны. Подробнее в главе Что такое DI-контейнер?
Экранирование
Экранирование – преобразование символов, имеющих в данном контексте особое значение, в другие соответствующие последовательности. Пример: мы хотим записать кавычки внутри строки, ограниченной кавычками. Поскольку кавычки в контексте строки имеют особое значение и их простая запись была бы истолкована как конец строки, их нужно записать другой соответствующей последовательностью. Точную последовательность определяют правила контекста.
Фильтр
В шаблонах фильтром обычно называют функцию, которая помогает изменить или переформатировать данные в окончательный вид. У шаблонов есть несколько стандартных фильтров.
Инвалидация
Уведомление сниппета о том, что он должен перерисоваться. В другом контексте это означает и удаление содержимого кеша.
JSON
Формат обмена данными, основанный на синтаксисе JavaScript (он является его подмножеством). Точную спецификацию найдёте на www.json.org.
Компонент
Многократно используемая часть приложения. Это может быть визуальная часть страницы, как описано в главе Пишем компоненты, либо компонентом называют и класс Component (такой компонент не обязан быть визуальным).
Управляющие символы
Управляющие символы – невидимые символы, которые могут оказаться в тексте и потенциально вызвать проблемы. Для их массового удаления из файлов можно использовать Code Checker, а для удаления из переменной – функцию Strings::normalize().
События
Событие – ожидаемая ситуация внутри объекта. При её возникновении вызываются так называемые обработчики, то есть callback'и, откликающиеся на событие (пример). Событием может быть, например, отправка формы, вход пользователя и т. п. События, стало быть, – форма инверсии управления.
Например, вход пользователя происходит в методе
Nette\Security\User::login(). У объекта User есть публичная переменная
$onLoggedIn, которая является массивом, куда любой может добавить
callback. В момент, когда пользователь входит, метод login() вызывает
все callback'и из массива. Формат имени переменной onXyz – соглашение,
используемое во всей Nette.
Latte
Один из самых продвинутых шаблонизаторов.
Модель
Модель – это данные и, прежде всего, функциональное ядро всего приложения. В ней содержится вся логика приложения (используется и термин бизнес-логика). Это M в MVC или MVP. Любое действие пользователя (вход, добавление товара в корзину, изменение значения в базе данных) представляет собой действие модели.
Модель управляет своим внутренним состоянием и предоставляет наружу твёрдый интерфейс. Вызовом функций этого интерфейса мы можем запрашивать или менять её состояние. Модель не знает о существовании представления или контроллера.
Model-View-Controller
Архитектура ПО, возникшая из потребности отделить в приложениях с графическим интерфейсом код обработки (контроллер) от кода логики приложения (модель) и от кода отображения данных (представление). Тем самым приложение становится понятнее, будущая разработка облегчается, а отдельные части можно тестировать по отдельности.
Model-View-Presenter
Архитектура, основанная на Model-View-Controller.
Модуль
Модуль представляет логическую часть приложения. В типичном
устройстве это группа презентеров и шаблонов, решающих определённую
область функциональности. Модули размещаются в отдельных
каталогах, например Front/, Admin/ или Shop/.
Например, интернет-магазин можно разделить на:
- витрину (
Shop/) для просмотра товаров и покупки - клиентскую часть (
Customer/) для управления заказами - администрирование (
Admin/) для операторов
Технически это обычные каталоги, но благодаря понятному разбиению
они помогают масштабировать приложение. Презентер Admin:Product:List
тем самым физически находился бы, например, в каталоге
app/Presentation/Admin/Product/List/ (см. отображение
презентеров).
Namespace
Пространство имён, часть языка PHP начиная с версии 5.3 и некоторых других языков программирования, позволяет использовать в разных библиотеках одинаково названные классы без конфликта имён. Смотрите документацию PHP.
Презентер
Презентер – объект, который принимает запрос, переведённый маршрутизатором из HTTP-запроса, и порождает ответ. Ответом может быть HTML-страница, изображение, XML-документ, файл на диске, JSON, перенаправление или что угодно, что вы придумаете.
Обычно под презентером понимают потомка класса Nette\Application\UI\Presenter. По входящим запросам он выполняет соответствующие действия и отрисовывает шаблоны.
Маршрутизатор
Двунаправленный переводчик между HTTP-запросом или URL и действием презентера. Двунаправленный означает, что из HTTP-запроса можно вывести действие презентера, а наоборот, для действия породить соответствующий URL. Подробнее в главе о маршрутизации URL.
SameSite cookie
Cookie SameSite дают механизм распознавания того, что привело к загрузке
страницы. Флаг может иметь три значения: Lax, Strict и
None (последнее требует HTTPS). Если запрос страницы приходит прямо с
сайта или пользователь открывает страницу, введя её напрямую в
адресную строку либо щёлкнув по закладке, браузер отправляет серверу
все cookie (то есть с флагами Lax, Strict и None). Если
пользователь переходит на сайт по ссылке с другого сайта, серверу
передаются cookie с флагами Lax и None. Если запрос возникает
иначе, например при отправке POST-формы с другого сайта, загрузке внутри
iframe, через JavaScript и т. п., отправляются только cookie с флагом None.
Сервис
В контексте Dependency Injection сервисом называют объект, который создаёт DI-контейнер и которым он управляет. Сервис можно легко заменить другой реализацией, например ради тестирования или изменения поведения приложения, без необходимости менять код, который сервис использует.
Сниппет
Сниппет – часть страницы, которую можно самостоятельно перерисовать при AJAX-запросе.
Представление
Представление – слой приложения, отвечающий за отображение результата запроса. Обычно он использует шаблонизатор и знает, как отобразить конкретные компоненты или результаты, полученные от модели.