Dépannage
- Nette ne fonctionne pas, une page blanche s'affiche
- Erreur 500 Erreur du serveur : Nous sommes désolés ! …
- Erreur #[\ReturnTypeWillChange] attribute should be used
- Configuration des autorisations de répertoire
- Comment modifier ou supprimer le répertoire www de l'URL ?
- Comment configurer un serveur pour de belles URL ?
- Les liens sont générés sans https:
- Utilisation des caractères { } en JavaScript
- Remarque Presenter::getContext() is deprecated
Nette ne fonctionne pas, une page blanche s'affiche
- Essayez de mettre
ini_set('display_errors', '1'); error_reporting(E_ALL);
aprèsdeclare(strict_types=1);
dans le fichierindex.php
pour forcer l'affichage des erreurs. - Si vous voyez toujours un écran blanc, il y a probablement une erreur dans la configuration du serveur et vous découvrirez
la raison dans le journal du serveur. Pour être sûr, vérifiez que PHP fonctionne en essayant d'imprimer quelque chose en
utilisant
echo 'test';
. - Si vous voyez une erreur Server Error : Nous sommes désolés ! …, passez à la section suivante :
Erreur 500 Erreur du serveur : Nous sommes désolés ! …
Cette page d'erreur est affichée par Nette en mode production. Si vous la voyez sur une machine de développement, passez en mode de développement.
Si le message d'erreur contient Tracy is unable to log error
, cherchez à savoir pourquoi les erreurs ne peuvent
pas être enregistrées. Pour ce faire, vous pouvez, par exemple, passer en mode développeur et
appeler Tracy\Debugger::log('hello');
après $configurator->enableTracy(...)
. Tracy vous dira
pourquoi il ne peut pas enregistrer. La cause est généralement l'insuffisance des
autorisations d' écriture dans le répertoire log/
.
Si la phrase Tracy is unable to log error
ne figure pas (ou plus) dans le message d'erreur, vous pouvez trouver la
raison de l'erreur dans le journal du répertoire log/
.
L'une des raisons les plus courantes est un cache obsolète. Alors que Nette met automatiquement et intelligemment à jour le
cache en mode développement, en mode production, il se concentre sur l'optimisation des performances, et c'est à vous de vider
le cache après chaque modification de code. Essayez de supprimer temp/cache
.
Erreur
#[\ReturnTypeWillChange] attribute should be used
Cette erreur se produit si vous avez mis à niveau PHP vers la version 8.1 mais que vous utilisez Nette, qui n'est pas
compatible avec cette version. La solution est donc de mettre à jour Nette vers une version plus récente en utilisant
composer update
. Nette supporte PHP 8.1 depuis la version 3.0. Si vous utilisez une version plus ancienne (vous
pouvez le savoir en consultant composer.json
), mettez à jour Nette
ou restez avec PHP 8.0.
Configuration des autorisations de répertoire
Si vous développez sous macOS ou Linux (ou tout autre système basé sur Unix), vous devez configurer les privilèges
d'écriture sur le serveur web. En supposant que votre application se trouve dans le répertoire par défaut
/var/www/html
(Fedora, CentOS, RHEL)
cd /var/www/html/MY_PROJECT
chmod -R a+rw temp log
Sur certains systèmes Linux (Fedora, CentOS, …), SELinux peut être activé par défaut. Vous devrez peut-être mettre à
jour les stratégies SELinux, ou définir les chemins des répertoires temp
et log
avec le contexte de
sécurité SELinux correct. Les répertoires temp
et log
doivent être définis avec le contexte
httpd_sys_rw_content_t
; pour le reste de l'application – principalement le dossier app
– le
contexte httpd_sys_content_t
sera suffisant. Exécutez sur le serveur en tant que root :
semanage fcontext -at httpd_sys_rw_content_t '/var/www/html/MY_PROJECT/log(/.*)?'
semanage fcontext -at httpd_sys_rw_content_t '/var/www/html/MY_PROJECT/temp(/.*)?'
restorecon -Rv /var/www/html/MY_PROJECT/
Ensuite, le booléen SELinux httpd_can_network_connect_db
doit être activé pour permettre à Nette de se
connecter à la base de données sur le réseau. Par défaut, il est désactivé. La commande setsebool
peut être
utilisée pour effectuer cette tâche, et si l'option -P
est spécifiée, ce paramètre sera persistant lors des
redémarrages.
setsebool -P httpd_can_network_connect_db on
Comment modifier ou supprimer le répertoire www
de
l'URL ?
Le répertoire www/
utilisé dans les exemples de projets de Nette est le répertoire public ou la racine du
document du projet. C'est le seul répertoire dont le contenu est accessible au navigateur. Il contient le fichier
index.php
, le point d'entrée qui permet de démarrer une application web écrite en Nette.
Pour exécuter l'application sur l'hébergement, vous devez définir le document-root sur ce répertoire dans la configuration
de l'hébergement. Ou, si l'hébergement a un dossier prédéfini pour le répertoire public avec un nom différent (par exemple
web
, public_html
etc.), renommez simplement www/
.
La solution n'est pas de se “débarrasser” du dossier www/
en utilisant des règles dans le fichier
.htaccess
ou dans le routeur. Si l'hébergement ne vous permet pas de définir document-root sur un sous-répertoire
(c'est-à-dire de créer des répertoires un niveau au-dessus du répertoire public), cherchez-en un autre. Sinon, vous prenez un
risque important en matière de sécurité. Ce serait comme vivre dans un appartement où vous ne pouvez pas fermer la porte
d'entrée et où elle est toujours grande ouverte.
Comment configurer un serveur pour de belles URL ?
Apache : l'extension mod_rewrite doit être autorisée et configurée dans un fichier .htaccess
.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
Pour modifier la configuration d'Apache avec des fichiers .htaccess, la directive AllowOverride doit être activée. Il s'agit du comportement par défaut d'Apache.
nginx : la directive try_files
doit être utilisée dans la configuration du serveur :
location / {
try_files $uri $uri/ /index.php$is_args$args; # $is_args$args is important
}
Le bloc location
doit être défini exactement une fois pour chaque chemin du système de fichiers dans le bloc
server
. Si vous avez déjà un bloc location /
dans votre configuration, ajoutez la directive
try_files
dans le bloc existant.
Les liens sont générés sans https:
Nette génère des liens avec le même protocole que celui utilisé par la page actuelle. Ainsi, sur la page
https://foo
et vice versa. Si vous vous trouvez derrière un reverse proxy HTTPS (par exemple, dans Docker), vous
devez mettre en place un proxy dans la configuration pour
que la détection du protocole fonctionne correctement.
Si vous utilisez Nginx comme proxy, vous devez configurer la redirection de la manière suivante :
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_pass http://IP-aplikace:80; # IP ou nom d'hôte du serveur/conteneur où s'exécute l'application
}
Ensuite, vous devez spécifier le proxy IP et, le cas échéant, la plage IP de votre réseau local où vous exécutez l'infrastructure :
http:
proxy: IP-proxy/IP-range
Utilisation des caractères { } en JavaScript
Les caractères {
and }
sont utilisés pour écrire les balises Latte. Tout ce qui suit (sauf
l'espace et le guillemet) {
character is considered a tag. If you need to print character {
(souvent en
JavaScript), vous pouvez mettre un espace (ou un autre caractère vide) juste après {
. De cette façon, vous évitez
de l'interpréter comme une balise.
S'il est nécessaire d'imprimer ces caractères dans une situation où ils seraient interprétés comme une balise, vous pouvez
utiliser des balises spéciales pour imprimer ces caractères – {l}
pour {
and {r}
pour
}
.
{is tag}
{ is not tag }
{l}is not tag{r}
Remarque Presenter::getContext() is deprecated
Nette est de loin le premier framework PHP à avoir adopté l'injection de dépendances et à avoir incité les programmeurs à
l'utiliser systématiquement, en commençant par les présentateurs. Si un présentateur a besoin d'une dépendance, il la demandera. En revanche, la façon dont nous
passons l'ensemble du conteneur DI à une classe pour qu'elle en tire directement les dépendances est considérée comme un
anti-modèle (cela s'appelle un localisateur de services). Cette méthode était utilisée dans Nette 0.x avant l'avènement de
l'injection de dépendances, et sa relique est la méthode Presenter::getContext()
, depuis longtemps marquée comme
dépréciée.
Si vous portez une très vieille application Nette, vous découvrirez peut-être qu'elle utilise encore cette méthode. Ainsi,
depuis la version 3.1 de nette/application
vous rencontrerez l'avertissement
Nette\Application\UI\Presenter::getContext() is deprecated, use dependency injection
, depuis la version 4.0 vous
rencontrerez l'erreur que la méthode n'existe pas.
La solution propre, bien sûr, est de reconcevoir l'application pour passer les dépendances en utilisant l'injection de
dépendances. Comme solution de rechange, vous pouvez ajouter votre propre méthode getContext()
à votre
présentateur de base et contourner le message :
abstract BasePresenter extends Nette\Application\UI\Presenter
{
private Nette\DI\Container $context;
public function injectContext(Nette\DI\Container $context)
{
$this->context = $context;
}
public function getContext(): Nette\DI\Container
{
return $this->context;
}
}