Nette Documentation Preview

syntax
Glossaire des termes
********************


AJAX
----
Asynchronous JavaScript and XML - une technologie d'échange d'informations entre le client et le serveur via le protocole HTTP, sans avoir besoin de recharger toute la page à chaque requête. Même si le nom peut laisser croire que les données ne sont envoyées qu'au format XML, le format [#JSON] est lui aussi couramment utilisé.


Action de presenter
-------------------
Partie logique d'un presenter qui effectue une seule action. Par exemple afficher la page d'un produit, déconnecter un utilisateur, etc. Un même presenter peut avoir plusieurs actions.


BOM
---
Le *byte order mark* est un premier caractère particulier dans un fichier, servant d'indicateur de l'ordre des octets dans l'encodage. Certains éditeurs l'insèrent dans les fichiers. Il est pratiquement invisible, mais provoque des problèmes lors de l'envoi de la sortie et des en-têtes depuis PHP. Vous pouvez utiliser [Code Checker|tools:code-checker] pour le supprimer en masse.


Controller
----------
Un contrôleur qui traite les requêtes de l'utilisateur et, sur cette base, appelle la logique applicative appropriée (c'est-à-dire le [#Model]), puis demande à la [#View] de rendre les données. L'équivalent des contrôleurs dans Nette Framework, ce sont les [presenters |#Presenter].


Cross-Site Scripting (XSS)
--------------------------
Le Cross-Site Scripting est une méthode de perturbation des sites web qui exploite des sorties non échappées. Un attaquant peut alors injecter son propre code dans la page et ainsi la modifier, voire obtenir des données sensibles sur les visiteurs. La protection contre le XSS consiste à échapper systématiquement et correctement toutes les chaînes affichées.

Nette Framework introduit la technologie révolutionnaire de l'[échappement contextuel |latte:safety-first#Échappement contextuel], qui élimine définitivement le risque de Cross-Site Scripting. Elle échappe automatiquement toutes les sorties, si bien qu'un développeur ne peut rien oublier.


Cross-Site Request Forgery (CSRF)
---------------------------------
Une attaque Cross-Site Request Forgery consiste, pour l'attaquant, à attirer la victime sur une page qui exécute discrètement, depuis son navigateur, une requête vers un serveur sur lequel elle est connectée. Le serveur croit que la requête a été faite volontairement par la victime. Sous l'identité de celle-ci, il effectue donc une action à son insu. Cela peut être la modification ou la suppression de données, l'envoi d'un message, etc.

Nette Framework **protège automatiquement les formulaires et les signaux des presenters** contre ce type d'attaque en empêchant qu'ils soient envoyés ou déclenchés depuis un autre domaine.


Cross-Origin Resource Sharing (CORS)
------------------------------------
Le CORS est un mécanisme de sécurité qui permet à une page web d'émettre en JavaScript des requêtes vers un domaine différent de celui depuis lequel la page a été chargée. Sans CORS, les navigateurs bloquent de telles requêtes pour des raisons de sécurité.

Par exemple, si votre site tourne sur `https://myapp.com` et essaie de récupérer des données depuis `https://api.example.com` en JavaScript (AJAX, Fetch API), le navigateur vérifiera si le serveur d'API autorise cette requête cross-origin. Le serveur d'API doit répondre avec des en-têtes HTTP particuliers, comme `Access-Control-Allow-Origin: https://myapp.com`, pour donner son accord.


Dependency Injection
--------------------
L'injection de dépendances (DI) est un patron de conception qui indique comment séparer la création des objets de leurs dépendances. Cela signifie qu'une classe n'est pas chargée de créer ni d'initialiser ses dépendances ; celles-ci lui sont fournies par du code externe (qui peut être un [conteneur DI |#Dependency Injection Container]). L'avantage réside dans une plus grande souplesse du code, une meilleure compréhensibilité et des tests d'application plus faciles, car les dépendances sont aisément remplaçables et isolées des autres parties du code. Plus d'informations dans le chapitre [Qu'est-ce que l'injection de dépendances ? |dependency-injection:introduction]


Dependency Injection Container
------------------------------
Un conteneur d'injection de dépendances (aussi conteneur DI ou conteneur IoC) est un outil qui gère la création et l'administration des dépendances (ou [services |#Service]) au sein d'une application. Le conteneur possède généralement une configuration définissant quelles classes dépendent d'autres, quelles implémentations concrètes des dépendances doivent être utilisées et comment ces dépendances doivent être créées. Le conteneur crée ensuite ces objets et les fournit aux classes qui en ont besoin. Plus d'informations dans le chapitre [Qu'est-ce qu'un conteneur DI ? |dependency-injection:container]


Échappement
-----------
L'échappement est la conversion des caractères ayant une signification particulière dans un contexte donné en d'autres séquences correspondantes. Exemple : nous voulons écrire des guillemets à l'intérieur d'une chaîne délimitée par des guillemets. Comme les guillemets ont une signification particulière dans le contexte de la chaîne et que les écrire simplement serait interprété comme la fin de la chaîne, il faut les écrire à l'aide d'une autre séquence correspondante. La séquence exacte est déterminée par les règles du contexte.


Filtre
------
Dans les templates, un [filtre |latte:syntax#Filtres] désigne généralement une fonction qui aide à modifier ou à reformater les données pour leur donner leur forme finale. Les templates fournissent plusieurs [filtres standards |latte:filters].


Invalidation
------------
Le fait de signaler à un [#Snippet] qu'il doit se redessiner. Dans un autre contexte, cela signifie aussi supprimer le contenu du cache.


JSON
----
Un format d'échange de données fondé sur la syntaxe de JavaScript (il en est un sous-ensemble). La spécification exacte se trouve sur www.json.org.


Composant
---------
Partie réutilisable d'une application. Il peut s'agir d'une partie visuelle de la page, comme décrit dans le chapitre [Écrire des composants |application:components], mais le terme composant désigne aussi la classe [Component |component-model:] (un tel composant n'est pas nécessairement visuel).


Caractères de contrôle
----------------------
Les caractères de contrôle sont des caractères invisibles qui peuvent apparaître dans un texte et provoquer des problèmes. Pour les supprimer en masse des fichiers, vous pouvez utiliser [Code Checker|tools:code-checker] et, pour les supprimer d'une variable, la fonction [Strings::normalize() |utils:strings#normalize()].


Événements
----------
Un événement est une situation attendue au sein d'un objet. Lorsqu'elle survient, ce qu'on appelle des handlers sont appelés, c'est-à-dire des callbacks réagissant à l'événement ("exemple":https://gist.github.com/dg/332cdd51bdf7d66a6d8003b134508a38). Un événement peut être, par exemple, l'envoi d'un formulaire, la connexion d'un utilisateur, etc. Les événements sont donc une forme d'*Inversion of Control*.

Par exemple, la connexion de l'utilisateur a lieu dans la méthode `Nette\Security\User::login()`. L'objet `User` possède une variable publique `$onLoggedIn`, qui est un tableau auquel n'importe qui peut ajouter un callback. Lorsque l'utilisateur se connecte, la méthode `login()` appelle tous les callbacks du tableau. La forme `onXyz` du nom de la variable est une convention utilisée dans tout Nette.


Latte
-----
L'un des [systèmes de templates |latte:] les plus élaborés.


Model
-----
Le modèle, ce sont les données et surtout le cœur fonctionnel de toute l'application. Il contient toute la logique applicative (on parle aussi de logique métier). C'est le **M** de **M**VC ou MVP. Toute action de l'utilisateur (connexion, ajout d'un article au panier, modification d'une valeur en base) représente une action du modèle.

Le modèle gère son état interne et offre vers l'extérieur une interface fixe. En appelant les fonctions de cette interface, nous pouvons interroger ou changer son état. Le modèle ignore l'existence de la [#View] et du [#Controller].


Model-View-Controller
---------------------
Une architecture logicielle née du besoin de séparer, dans les applications à interface graphique, le code de traitement ([#Controller]) du code de la logique applicative ([#Model]) et du code d'affichage des données ([#View]). Cela rend l'application plus claire, facilite son développement futur et permet de tester séparément ses différentes parties.


Model-View-Presenter
--------------------
Une architecture fondée sur [#Model-View-Controller].


Module
------
Un module représente une partie logique de l'application. Dans une organisation typique, c'est un groupe de presenters et de templates traitant un domaine fonctionnel précis. Les modules sont placés dans des [répertoires distincts |application:directory-structure#Presenters et templates], comme `Front/`, `Admin/` ou `Shop/`.

Par exemple, une boutique en ligne peut être divisée en :
- Frontend (`Shop/`) pour parcourir les produits et acheter
- Espace client (`Customer/`) pour la gestion des commandes
- Administration (`Admin/`) pour les opérateurs

Techniquement, ce sont de simples répertoires, mais grâce à une structuration claire, ils aident à faire évoluer l'application. Le presenter `Admin:Product:List` se trouverait ainsi physiquement, par exemple, dans le répertoire `app/Presentation/Admin/Product/List/` (voir le [mapping des presenters |application:directory-structure#Mapping des presenters]).


Espace de noms
--------------
Un espace de noms, présent dans le langage PHP depuis la version 5.3 et dans certains autres langages de programmation, permet d'utiliser dans différentes bibliothèques des classes portant le même nom sans collision de noms. Voir la [documentation PHP |https://www.php.net/manual/en/language.namespaces.rationale.php].


Presenter
---------
Un presenter est un objet qui prend une [requête |api:Nette\Application\Request] traduite par le routeur depuis une requête HTTP et génère une [réponse |api:Nette\Application\Response]. La réponse peut être une page HTML, une image, un document XML, un fichier sur le disque, du JSON, une redirection ou tout ce que vous imaginerez.

Habituellement, le terme presenter désigne un descendant de la classe [api:Nette\Application\UI\Presenter]. En fonction des requêtes entrantes, il exécute les [actions |application:presenters#Cycle de vie du presenter] correspondantes et rend les templates.


Router
------
Un traducteur bidirectionnel entre une requête HTTP / URL et une action de presenter. Bidirectionnel signifie qu'il est possible de déduire une [#Action de presenter] d'une requête HTTP et, inversement, de générer l'URL correspondant à une action. Plus d'informations dans le chapitre sur le [routage des URL |application:routing].


Cookie SameSite
---------------
Les cookies SameSite offrent un mécanisme permettant de reconnaître ce qui a conduit au chargement de la page. Il peut prendre trois valeurs : `Lax`, `Strict` et `None` (cette dernière exige HTTPS). Si la requête pour la page vient directement du site ou si l'utilisateur ouvre la page en la tapant directement dans la barre d'adresse ou en cliquant sur un favori, le navigateur envoie tous les cookies au serveur (c'est-à-dire ceux portant les drapeaux `Lax`, `Strict` et `None`). Si l'utilisateur arrive sur le site par un lien venant d'un autre site, les cookies portant les drapeaux `Lax` et `None` sont transmis au serveur. Si la requête est émise autrement, par exemple par l'envoi d'un formulaire POST depuis un autre site, un chargement dans une iframe, l'usage de JavaScript, etc., seuls les cookies portant le drapeau `None` sont envoyés.


Service
-------
Dans le contexte de l'injection de dépendances, un service désigne un objet créé et géré par le conteneur DI. Un service peut être facilement remplacé par une autre implémentation, par exemple à des fins de test ou pour changer le comportement de l'application, sans avoir à modifier le code qui l'utilise.


Snippet
-------
Un snippet, partie d'une page qui peut être redessinée indépendamment lors d'une requête AJAX.


View
----
La vue est la couche de l'application chargée d'afficher le résultat d'une requête. Elle utilise généralement un système de templates et sait afficher les composants ou les résultats obtenus du modèle.





{{priority: -2}}

Glossaire des termes

AJAX

Asynchronous JavaScript and XML – une technologie d'échange d'informations entre le client et le serveur via le protocole HTTP, sans avoir besoin de recharger toute la page à chaque requête. Même si le nom peut laisser croire que les données ne sont envoyées qu'au format XML, le format JSON est lui aussi couramment utilisé.

Action de presenter

Partie logique d'un presenter qui effectue une seule action. Par exemple afficher la page d'un produit, déconnecter un utilisateur, etc. Un même presenter peut avoir plusieurs actions.

BOM

Le byte order mark est un premier caractère particulier dans un fichier, servant d'indicateur de l'ordre des octets dans l'encodage. Certains éditeurs l'insèrent dans les fichiers. Il est pratiquement invisible, mais provoque des problèmes lors de l'envoi de la sortie et des en-têtes depuis PHP. Vous pouvez utiliser Code Checker pour le supprimer en masse.

Controller

Un contrôleur qui traite les requêtes de l'utilisateur et, sur cette base, appelle la logique applicative appropriée (c'est-à-dire le Model), puis demande à la View de rendre les données. L'équivalent des contrôleurs dans Nette Framework, ce sont les presenters.

Cross-Site Scripting (XSS)

Le Cross-Site Scripting est une méthode de perturbation des sites web qui exploite des sorties non échappées. Un attaquant peut alors injecter son propre code dans la page et ainsi la modifier, voire obtenir des données sensibles sur les visiteurs. La protection contre le XSS consiste à échapper systématiquement et correctement toutes les chaînes affichées.

Nette Framework introduit la technologie révolutionnaire de l'échappement contextuel, qui élimine définitivement le risque de Cross-Site Scripting. Elle échappe automatiquement toutes les sorties, si bien qu'un développeur ne peut rien oublier.

Cross-Site Request Forgery (CSRF)

Une attaque Cross-Site Request Forgery consiste, pour l'attaquant, à attirer la victime sur une page qui exécute discrètement, depuis son navigateur, une requête vers un serveur sur lequel elle est connectée. Le serveur croit que la requête a été faite volontairement par la victime. Sous l'identité de celle-ci, il effectue donc une action à son insu. Cela peut être la modification ou la suppression de données, l'envoi d'un message, etc.

Nette Framework protège automatiquement les formulaires et les signaux des presenters contre ce type d'attaque en empêchant qu'ils soient envoyés ou déclenchés depuis un autre domaine.

Cross-Origin Resource Sharing (CORS)

Le CORS est un mécanisme de sécurité qui permet à une page web d'émettre en JavaScript des requêtes vers un domaine différent de celui depuis lequel la page a été chargée. Sans CORS, les navigateurs bloquent de telles requêtes pour des raisons de sécurité.

Par exemple, si votre site tourne sur https://myapp.com et essaie de récupérer des données depuis https://api.example.com en JavaScript (AJAX, Fetch API), le navigateur vérifiera si le serveur d'API autorise cette requête cross-origin. Le serveur d'API doit répondre avec des en-têtes HTTP particuliers, comme Access-Control-Allow-Origin: https://myapp.com, pour donner son accord.

Dependency Injection

L'injection de dépendances (DI) est un patron de conception qui indique comment séparer la création des objets de leurs dépendances. Cela signifie qu'une classe n'est pas chargée de créer ni d'initialiser ses dépendances ; celles-ci lui sont fournies par du code externe (qui peut être un conteneur DI). L'avantage réside dans une plus grande souplesse du code, une meilleure compréhensibilité et des tests d'application plus faciles, car les dépendances sont aisément remplaçables et isolées des autres parties du code. Plus d'informations dans le chapitre Qu'est-ce que l'injection de dépendances ?

Dependency Injection Container

Un conteneur d'injection de dépendances (aussi conteneur DI ou conteneur IoC) est un outil qui gère la création et l'administration des dépendances (ou services) au sein d'une application. Le conteneur possède généralement une configuration définissant quelles classes dépendent d'autres, quelles implémentations concrètes des dépendances doivent être utilisées et comment ces dépendances doivent être créées. Le conteneur crée ensuite ces objets et les fournit aux classes qui en ont besoin. Plus d'informations dans le chapitre Qu'est-ce qu'un conteneur DI ?

Échappement

L'échappement est la conversion des caractères ayant une signification particulière dans un contexte donné en d'autres séquences correspondantes. Exemple : nous voulons écrire des guillemets à l'intérieur d'une chaîne délimitée par des guillemets. Comme les guillemets ont une signification particulière dans le contexte de la chaîne et que les écrire simplement serait interprété comme la fin de la chaîne, il faut les écrire à l'aide d'une autre séquence correspondante. La séquence exacte est déterminée par les règles du contexte.

Filtre

Dans les templates, un filtre désigne généralement une fonction qui aide à modifier ou à reformater les données pour leur donner leur forme finale. Les templates fournissent plusieurs filtres standards.

Invalidation

Le fait de signaler à un Snippet qu'il doit se redessiner. Dans un autre contexte, cela signifie aussi supprimer le contenu du cache.

JSON

Un format d'échange de données fondé sur la syntaxe de JavaScript (il en est un sous-ensemble). La spécification exacte se trouve sur www.json.org.

Composant

Partie réutilisable d'une application. Il peut s'agir d'une partie visuelle de la page, comme décrit dans le chapitre Écrire des composants, mais le terme composant désigne aussi la classe Component (un tel composant n'est pas nécessairement visuel).

Caractères de contrôle

Les caractères de contrôle sont des caractères invisibles qui peuvent apparaître dans un texte et provoquer des problèmes. Pour les supprimer en masse des fichiers, vous pouvez utiliser Code Checker et, pour les supprimer d'une variable, la fonction Strings::normalize().

Événements

Un événement est une situation attendue au sein d'un objet. Lorsqu'elle survient, ce qu'on appelle des handlers sont appelés, c'est-à-dire des callbacks réagissant à l'événement (exemple). Un événement peut être, par exemple, l'envoi d'un formulaire, la connexion d'un utilisateur, etc. Les événements sont donc une forme d'Inversion of Control.

Par exemple, la connexion de l'utilisateur a lieu dans la méthode Nette\Security\User::login(). L'objet User possède une variable publique $onLoggedIn, qui est un tableau auquel n'importe qui peut ajouter un callback. Lorsque l'utilisateur se connecte, la méthode login() appelle tous les callbacks du tableau. La forme onXyz du nom de la variable est une convention utilisée dans tout Nette.

Latte

L'un des systèmes de templates les plus élaborés.

Model

Le modèle, ce sont les données et surtout le cœur fonctionnel de toute l'application. Il contient toute la logique applicative (on parle aussi de logique métier). C'est le M de MVC ou MVP. Toute action de l'utilisateur (connexion, ajout d'un article au panier, modification d'une valeur en base) représente une action du modèle.

Le modèle gère son état interne et offre vers l'extérieur une interface fixe. En appelant les fonctions de cette interface, nous pouvons interroger ou changer son état. Le modèle ignore l'existence de la View et du Controller.

Model-View-Controller

Une architecture logicielle née du besoin de séparer, dans les applications à interface graphique, le code de traitement (Controller) du code de la logique applicative (Model) et du code d'affichage des données (View). Cela rend l'application plus claire, facilite son développement futur et permet de tester séparément ses différentes parties.

Model-View-Presenter

Une architecture fondée sur Model-View-Controller.

Module

Un module représente une partie logique de l'application. Dans une organisation typique, c'est un groupe de presenters et de templates traitant un domaine fonctionnel précis. Les modules sont placés dans des répertoires distincts, comme Front/, Admin/ ou Shop/.

Par exemple, une boutique en ligne peut être divisée en :

  • Frontend (Shop/) pour parcourir les produits et acheter
  • Espace client (Customer/) pour la gestion des commandes
  • Administration (Admin/) pour les opérateurs

Techniquement, ce sont de simples répertoires, mais grâce à une structuration claire, ils aident à faire évoluer l'application. Le presenter Admin:Product:List se trouverait ainsi physiquement, par exemple, dans le répertoire app/Presentation/Admin/Product/List/ (voir le mapping des presenters).

Espace de noms

Un espace de noms, présent dans le langage PHP depuis la version 5.3 et dans certains autres langages de programmation, permet d'utiliser dans différentes bibliothèques des classes portant le même nom sans collision de noms. Voir la documentation PHP.

Presenter

Un presenter est un objet qui prend une requête traduite par le routeur depuis une requête HTTP et génère une réponse. La réponse peut être une page HTML, une image, un document XML, un fichier sur le disque, du JSON, une redirection ou tout ce que vous imaginerez.

Habituellement, le terme presenter désigne un descendant de la classe Nette\Application\UI\Presenter. En fonction des requêtes entrantes, il exécute les actions correspondantes et rend les templates.

Router

Un traducteur bidirectionnel entre une requête HTTP / URL et une action de presenter. Bidirectionnel signifie qu'il est possible de déduire une Action de presenter d'une requête HTTP et, inversement, de générer l'URL correspondant à une action. Plus d'informations dans le chapitre sur le routage des URL.

Les cookies SameSite offrent un mécanisme permettant de reconnaître ce qui a conduit au chargement de la page. Il peut prendre trois valeurs : Lax, Strict et None (cette dernière exige HTTPS). Si la requête pour la page vient directement du site ou si l'utilisateur ouvre la page en la tapant directement dans la barre d'adresse ou en cliquant sur un favori, le navigateur envoie tous les cookies au serveur (c'est-à-dire ceux portant les drapeaux Lax, Strict et None). Si l'utilisateur arrive sur le site par un lien venant d'un autre site, les cookies portant les drapeaux Lax et None sont transmis au serveur. Si la requête est émise autrement, par exemple par l'envoi d'un formulaire POST depuis un autre site, un chargement dans une iframe, l'usage de JavaScript, etc., seuls les cookies portant le drapeau None sont envoyés.

Service

Dans le contexte de l'injection de dépendances, un service désigne un objet créé et géré par le conteneur DI. Un service peut être facilement remplacé par une autre implémentation, par exemple à des fins de test ou pour changer le comportement de l'application, sans avoir à modifier le code qui l'utilise.

Snippet

Un snippet, partie d'une page qui peut être redessinée indépendamment lors d'une requête AJAX.

View

La vue est la couche de l'application chargée d'afficher le résultat d'une requête. Elle utilise généralement un système de templates et sait afficher les composants ou les résultats obtenus du modèle.