Fehlersuche
- Nette funktioniert nicht, es wird eine weiße Seite angezeigt
- Fehler 500 Serverfehler: Es tut uns leid! …
- Fehler #[\ReturnTypeWillChange] attribute should be used
- Verzeichnisberechtigungen einstellen
- Wie kann man das Verzeichnis www aus der URL ändern oder entfernen?
- Wie konfiguriert man einen Server für schöne URLs?
- Links werden ohne https: erzeugt.
- Verwendung der Zeichen { } in JavaScript
- Hinweis Presenter::getContext() is deprecated
Nette funktioniert nicht, es wird eine weiße Seite angezeigt
- Versuchen Sie,
ini_set('display_errors', '1'); error_reporting(E_ALL);
nachdeclare(strict_types=1);
in die Dateiindex.php
einzufügen, um die Anzeige von Fehlern zu erzwingen. - Wenn Sie immer noch einen weißen Bildschirm sehen, liegt wahrscheinlich ein Fehler in der Serverkonfiguration vor und Sie
werden den Grund dafür im Serverprotokoll finden. Um sicherzugehen, überprüfen Sie, ob PHP überhaupt funktioniert, indem Sie
versuchen, mit
echo 'test';
etwas zu drucken. - Wenn Sie eine Fehlermeldung Server Error sehen: Es tut uns leid! …, fahren Sie mit dem nächsten Abschnitt fort:
Fehler 500 Serverfehler: Es tut uns leid! …
Diese Fehlerseite wird von Nette im Produktionsmodus angezeigt. Wenn Sie sie auf einem Entwicklerrechner sehen, wechseln Sie in den Entwicklermodus.
Wenn die Fehlermeldung Tracy is unable to log error
enthält, finden Sie heraus, warum die Fehler nicht
protokolliert werden können. Wechseln Sie dazu z. B. in den
Entwicklermodus und rufen Sie Tracy\Debugger::log('hello');
nach $configurator->enableTracy(...)
auf.
Tracy wird Ihnen sagen, warum es nicht protokollieren kann. Die Ursache ist in der Regel eine unzureichende Berechtigung zum Schreiben in das Verzeichnis log/
.
Wenn der Satz Tracy is unable to log error
nicht (mehr) in der Fehlermeldung steht, können Sie den Grund für den
Fehler im Protokoll im Verzeichnis log/
herausfinden.
Einer der häufigsten Gründe ist ein veralteter Cache. Während Nette im Entwicklungsmodus den Cache automatisch aktualisiert,
konzentriert es sich im Produktionsmodus auf die Maximierung der Leistung, und es liegt an Ihnen, den Cache nach jeder
Codeänderung zu leeren. Versuchen Sie, temp/cache
zu löschen.
Fehler
#[\ReturnTypeWillChange] attribute should be used
Dieser Fehler tritt auf, wenn Sie PHP auf Version 8.1 aktualisiert haben, aber Nette verwenden, das damit nicht kompatibel
ist. Die Lösung besteht also darin, Nette mit composer update
auf eine neuere Version zu aktualisieren. Nette
unterstützt PHP 8.1 seit Version 3.0. Wenn Sie eine ältere Version verwenden (Sie können dies unter
composer.json
herausfinden), aktualisieren Sie Nette oder bleiben
Sie bei PHP 8.0.
Verzeichnisberechtigungen einstellen
Wenn Sie auf macOS oder Linux (oder einem anderen Unix-basierten System) entwickeln, müssen Sie Schreibrechte für den
Webserver konfigurieren. Angenommen, Ihre Anwendung befindet sich in dem Standardverzeichnis /var/www/html
(Fedora,
CentOS, RHEL)
cd /var/www/html/MY_PROJECT
chmod -R a+rw temp log
Auf einigen Linux-Systemen (Fedora, CentOS, …) kann SELinux standardmäßig aktiviert sein. Möglicherweise müssen Sie die
SELinux-Richtlinien aktualisieren oder die Pfade der Verzeichnisse temp
und log
mit dem richtigen
SELinux-Sicherheitskontext versehen. Die Verzeichnisse temp
und log
sollten auf den Kontext
httpd_sys_rw_content_t
gesetzt werden; für den Rest der Anwendung – hauptsächlich den Ordner
app
– reicht der Kontext httpd_sys_content_t
aus. Führen Sie das Programm auf dem Server als
root aus:
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/
Als nächstes muss der SELinux-Boolesche Wert httpd_can_network_connect_db
aktiviert werden, damit Nette über das
Netzwerk eine Verbindung zur Datenbank herstellen kann. Standardmäßig ist er deaktiviert. Der Befehl setsebool
kann
zur Durchführung dieser Aufgabe verwendet werden, und wenn die Option -P
angegeben wird, bleibt diese Einstellung
über Neustarts hinweg bestehen.
setsebool -P httpd_can_network_connect_db on
Wie kann man das Verzeichnis www
aus der URL ändern oder
entfernen?
Das Verzeichnis www/
, das in den Beispielprojekten in Nette verwendet wird, ist das so genannte öffentliche
Verzeichnis oder Dokument-Wurzelverzeichnis des Projekts. Es ist das einzige Verzeichnis, dessen Inhalt für den Browser
zugänglich ist. Und es enthält die Datei index.php
, den Einstiegspunkt, der eine in Nette geschriebene Webanwendung
startet.
Um die Anwendung auf dem Hosting laufen zu lassen, müssen Sie das document-root in der Hosting-Konfiguration auf dieses
Verzeichnis setzen. Oder, wenn das Hosting einen vorgefertigten Ordner für das öffentliche Verzeichnis mit einem anderen Namen
hat (zum Beispiel web
, public_html
usw.), benennen Sie einfach www/
um.
Die Lösung ist nicht, den Ordner www/
durch Regeln in der Datei .htaccess
oder im Router
“loszuwerden”. Wenn das Hosting Ihnen nicht erlaubt, document-root auf ein Unterverzeichnis zu setzen (d.h. Verzeichnisse eine
Ebene über dem öffentlichen Verzeichnis zu erstellen), suchen Sie nach einem anderen. Andernfalls würden Sie ein erhebliches
Sicherheitsrisiko eingehen. Das wäre so, als würden Sie in einer Wohnung leben, deren Eingangstür Sie nicht schließen können
und die immer weit offen steht.
Wie konfiguriert man einen Server für schöne URLs?
Apache: Die Erweiterung mod_rewrite muss erlaubt und in einer Datei .htaccess
konfiguriert sein.
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]
Um die Apache-Konfiguration mit .htaccess-Dateien zu ändern, muss die AllowOverride-Direktive aktiviert werden. Dies ist das Standardverhalten von Apache.
nginx: Die Richtlinie try_files
sollte in der Serverkonfiguration verwendet werden:
location / {
try_files $uri $uri/ /index.php$is_args$args; # $is_args$args is important
}
Der Block location
muss genau einmal für jeden Dateisystempfad im Block server
definiert werden.
Wenn Sie bereits einen location /
-Block in Ihrer Konfiguration haben, fügen Sie die Direktive
try_files
in den bestehenden Block ein.
Links werden ohne https:
erzeugt.
Nette generiert Links mit demselben Protokoll, das die aktuelle Seite verwendet. Auf der Seite https://foo
beginnen, und andersherum. Wenn Sie sich hinter einem HTTPS-Stripping-Reverse-Proxy befinden (z. B. in Docker), müssen Sie in der
Konfiguration einen Proxy ein richten, damit die
Protokollerkennung richtig funktioniert.
Wenn Sie Nginx als Proxy verwenden, müssen Sie die Umleitung wie folgt einrichten:
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 oder Hostname des Servers/Containers, auf dem die Anwendung läuft
}
Als Nächstes müssen Sie den IP-Proxy und ggf. den IP-Bereich Ihres lokalen Netzwerks angeben, in dem Sie die Infrastruktur betreiben:
http:
proxy: IP-proxy/IP-range
Verwendung der Zeichen { } in JavaScript
Die Zeichen {
and }
werden zum Schreiben von Latte-Tags verwendet. Alles (außer Leerzeichen und
Anführungszeichen) nach dem {
character is considered a tag. If you need to print character {
(oft in
JavaScript), können Sie ein Leerzeichen (oder ein anderes leeres Zeichen) direkt nach {
setzen. Auf diese Weise
vermeiden Sie, dass es als Tag interpretiert wird.
Wenn es notwendig ist, diese Zeichen in einer Situation auszugeben, in der sie als Tag interpretiert werden würden, können
Sie spezielle Tags verwenden, um diese Zeichen auszugeben – {l}
für {
and {r}
für
}
.
{is tag}
{ is not tag }
{l}is not tag{r}
Hinweis Presenter::getContext() is deprecated
Nette ist bei weitem das erste PHP-Framework, das auf Dependency Injection umgestiegen ist und Programmierer dazu gebracht hat,
es konsequent zu nutzen, angefangen bei den Moderatoren. Wenn ein Präsentator eine Abhängigkeit benötigt, wird er danach fragen. Im Gegensatz dazu wird die
Art und Weise, wie wir den gesamten DI-Container an eine Klasse übergeben und diese die Abhängigkeiten direkt daraus zieht, als
ein Antipattern betrachtet (es wird Service-Locator genannt). Diese Methode wurde in Nette 0.x vor dem Aufkommen von Dependency
Injection verwendet, und ihr Überbleibsel ist die Methode Presenter::getContext()
, die schon vor langer Zeit als
veraltet markiert wurde.
Wenn Sie eine sehr alte Nette-Anwendung portieren, werden Sie feststellen, dass sie diese Methode immer noch verwendet. Seit
Version 3.1 von nette/application
werden Sie also auf die Warnung
Nette\Application\UI\Presenter::getContext() is deprecated, use dependency injection
stoßen, seit Version 4.0 auf
den Fehler, dass die Methode nicht existiert.
Die saubere Lösung besteht natürlich darin, die Anwendung so umzugestalten, dass Abhängigkeiten mittels Dependency Injection
übergeben werden. Als Workaround können Sie Ihre eigene Methode getContext()
zu Ihrem Basispräsenter hinzufügen
und die Meldung umgehen:
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;
}
}