Risoluzione dei problemi
- Nette non funziona, viene visualizzata una pagina bianca
- Errore 500 Errore del server: Ci dispiace! …
- Errore #[\ReturnTypeWillChange] attribute should be used
- Impostazione dei permessi di directory
- Come modificare o rimuovere la directory www dall'URL?
- Come configurare un server per avere URL gradevoli?
- I collegamenti sono generati senza https:
- Uso dei caratteri { } in JavaScript
- Notare Presenter::getContext() is deprecated
Nette non funziona, viene visualizzata una pagina bianca
- Provare a inserire
ini_set('display_errors', '1'); error_reporting(E_ALL);
dopodeclare(strict_types=1);
nel fileindex.php
per forzare la visualizzazione degli errori. - Se si continua a vedere una schermata bianca, probabilmente c'è un errore nella configurazione del server e si potrà
scoprire il motivo nel log del server. Per essere sicuri, verificare se PHP funziona provando a stampare qualcosa con
echo 'test';
. - Se viene visualizzato un errore Errore del server: Ci dispiace! …, continuare con la sezione successiva:
Errore 500 Errore del server: Ci dispiace! …
Questa pagina di errore viene visualizzata da Nette in modalità di produzione. Se viene visualizzata su una macchina per sviluppatori, passare alla modalità sviluppatore.
Se il messaggio di errore contiene Tracy is unable to log error
, scoprire perché gli errori non possono essere
registrati. È possibile farlo, ad esempio, passando alla modalità sviluppatore
e chiamando Tracy\Debugger::log('hello');
dopo $configurator->enableTracy(...)
. Tracy vi dirà
perché non può essere registrato. Di solito la causa è l'insufficienza dei
permessi di scrittura nella directory log/
.
Se la frase Tracy is unable to log error
non compare (più) nel messaggio di errore, si può scoprire il motivo
dell'errore nel log della cartella log/
.
Una delle ragioni più comuni è una cache non aggiornata. Mentre Nette aggiorna automaticamente la cache in modalità di
sviluppo, in modalità di produzione si concentra sulla massimizzazione delle prestazioni e la cancellazione della cache dopo ogni
modifica del codice dipende da voi. Provate a cancellare temp/cache
.
Errore
#[\ReturnTypeWillChange] attribute should be used
Questo errore si verifica se si è aggiornato PHP alla versione 8.1 ma si sta utilizzando Nette, che non è compatibile con
essa. La soluzione è aggiornare Nette a una versione più recente utilizzando composer update
. Nette supporta PHP
8.1 dalla versione 3.0. Se si sta utilizzando una versione più vecchia (lo si può scoprire consultando
composer.json
), aggiornare Nette o rimanere con PHP 8.0.
Impostazione dei permessi di directory
Se si sta sviluppando su macOS o Linux (o qualsiasi altro sistema basato su Unix), è necessario configurare i privilegi di
scrittura sul server web. Supponendo che l'applicazione si trovi nella directory predefinita /var/www/html
(Fedora,
CentOS, RHEL)
cd /var/www/html/MY_PROJECT
chmod -R a+rw temp log
Su alcuni sistemi Linux (Fedora, CentOS, …) SELinux potrebbe essere abilitato per impostazione predefinita. Potrebbe essere
necessario aggiornare le politiche SELinux o impostare i percorsi delle directory temp
e log
con il
corretto contesto di sicurezza SELinux. Le directory temp
e log
dovrebbero essere impostate con il
contesto httpd_sys_rw_content_t
; per il resto dell'applicazione, principalmente la cartella app
, il
contesto httpd_sys_content_t
sarà sufficiente. Eseguire sul server come 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/
Successivamente, il booleano SELinux httpd_can_network_connect_db
deve essere abilitato per consentire a Nette di
connettersi al database in rete. Per impostazione predefinita, è disabilitato. Il comando setsebool
può essere
usato per eseguire questa operazione e se viene specificata l'opzione -P
, questa impostazione sarà persistente tra
i vari riavvii.
setsebool -P httpd_can_network_connect_db on
Come modificare o rimuovere la directory www
dall'URL?
La directory www/
utilizzata nei progetti di esempio di Nette è la cosiddetta directory pubblica o document-root
del progetto. È l'unica directory il cui contenuto è accessibile al browser. Contiene il file index.php
, il punto
di ingresso che avvia un'applicazione web scritta in Nette.
Per eseguire l'applicazione sull'hosting, è necessario impostare la document-root su questa directory nella configurazione
dell'hosting. Oppure, se l'hosting ha una cartella preconfezionata per la directory pubblica con un nome diverso (ad esempio
web
, public_html
ecc.), è sufficiente rinominare www/
.
La soluzione non è quella di “sbarazzarsi” della cartella www/
usando regole nel file
.htaccess
o nel router. Se l'hosting non vi permette di impostare document-root su una sottodirectory (cioè di
creare directory un livello sopra la directory pubblica), cercatene un'altra. In caso contrario, si correrebbe un rischio
significativo per la sicurezza. Sarebbe come vivere in un appartamento in cui non si può chiudere la porta d'ingresso, che rimane
sempre aperta.
Come configurare un server per avere URL gradevoli?
Apache: l'estensione mod_rewrite deve essere consentita e configurata in un file .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]
Per modificare la configurazione di Apache con i file .htaccess, è necessario abilitare la direttiva AllowOverride. Questo è il comportamento predefinito di Apache.
nginx: la direttiva try_files
deve essere usata nella configurazione del server:
location / {
try_files $uri $uri/ /index.php$is_args$args; # $is_args$args is important
}
Il blocco location
deve essere definito esattamente una volta per ogni percorso del filesystem nel blocco
server
. Se nella configurazione è già presente un blocco location /
, aggiungere la direttiva
try_files
al blocco esistente.
I collegamenti sono generati senza https:
Nette genera i link con lo stesso protocollo utilizzato dalla pagina corrente. Quindi, nella pagina https://foo
e
viceversa. Se ci si trova dietro a un reverse proxy che blocca HTTPS (per esempio, in Docker), è necessario impostare un proxy nella configurazione per far funzionare
correttamente il rilevamento del protocollo.
Se si usa Nginx come proxy, è necessario impostare il reindirizzamento in questo modo:
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 or hostname of the server/container where the application is running
}
Successivamente, è necessario specificare il proxy IP e, se applicabile, l'intervallo IP della rete locale in cui viene eseguita l'infrastruttura:
http:
proxy: IP-proxy/IP-range
Uso dei caratteri { } in JavaScript
I caratteri {
and }
sono utilizzati per scrivere i tag Latte. Per tutto ciò che (eccetto spazi e
virgolette) segue {
character is considered a tag. If you need to print character {
(spesso in
JavaScript), si può mettere uno spazio (o un altro carattere vuoto) subito dopo {
. In questo modo si evita di
interpretarlo come un tag.
Se è necessario stampare questi caratteri in una situazione in cui verrebbero interpretati come tag, si possono usare tag
speciali per stampare questi caratteri – {l}
per {
and {r}
per }
.
{is tag}
{ is not tag }
{l}is not tag{r}
Notare Presenter::getContext() is deprecated
Nette è di gran lunga il primo framework PHP che è passato all'iniezione di dipendenze e ha indotto i programmatori a usarla
in modo coerente, a partire dai presentatori. Se un presentatore ha bisogno di una dipendenza, la chiederà. Al contrario, il modo in cui passiamo
l'intero contenitore DI a una classe e questa preleva direttamente le dipendenze è considerato un antipattern (si chiama
localizzatore di servizi). Questo modo era usato in Nette 0.x, prima dell'avvento della dependency injection, e la sua reliquia è
il metodo Presenter::getContext()
, da tempo segnato come deprecato.
Se si esegue il porting di un'applicazione Nette molto vecchia, si può scoprire che utilizza ancora questo metodo. Quindi,
dalla versione 3.1 di nette/application
si incontrerà l'avviso
Nette\Application\UI\Presenter::getContext() is deprecated, use dependency injection
, dalla versione 4.0 si
incontrerà l'errore che il metodo non esiste.
La soluzione pulita, ovviamente, è quella di riprogettare l'applicazione per passare le dipendenze usando la dependency
injection. Come soluzione alternativa, si può aggiungere il proprio metodo getContext()
al presentatore di base e
aggirare il messaggio:
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;
}
}