Sorun Giderme
Nette Çalışmıyor, Beyaz Sayfa Görüntüleniyor
- Hataların görüntülenmesini zorlamak için
index.php
dosyasındadeclare(strict_types=1);
adresinden sonraini_set('display_errors', '1'); error_reporting(E_ALL);
adresini koymayı deneyin - Hala beyaz bir ekran görüyorsanız, muhtemelen sunucu kurulumunda bir hata vardır ve nedenini sunucu günlüğünde
keşfedeceksiniz. Emin olmak için,
echo 'test';
adresini kullanarak bir şeyler yazdırmayı deneyerek PHP'nin çalışıp çalışmadığını kontrol edin. - Eğer bir hata görürseniz Sunucu Hatası: Üzgünüz! … hatasını görürseniz, bir sonraki bölümle devam edin:
Hata 500 Sunucu Hatası: Üzgünüz! …
Bu hata sayfası Nette tarafından üretim modunda görüntülenir. Geliştirme makinenizde görürseniz, geliştirici moduna geçin ve Tracy ayrıntılı bir raporla birlikte görüntülenecektir.
Hatanın nedenini her zaman log/
dizininde bulabilirsiniz. Ancak, hata mesajı
Tracy is unable to log error
ifadesini gösteriyorsa, önce hataların neden günlüğe kaydedilemediğini
belirleyin. Bunu, örneğin, geçici olarak geliştirici moduna geçerek ve Tracy'nin başlatıldıktan
sonra herhangi bir şeyi günlüğe kaydetmesine izin vererek yapabilirsiniz:
// Bootstrap.php
$configurator->setDebugMode('23.75.345.200'); // IP adresiniz
$configurator->enableTracy($rootDir . '/log');
\Tracy\Debugger::log('hello');
Tracy neden günlüğe kaydedemediğini size bildirecektir. Bunun nedeni log/
dizinine yazma izinlerinin yetersiz olması olabilir.
Bir 500 hatasının en yaygın nedenlerinden biri güncel olmayan önbellektir. Nette, geliştirme modunda önbelleği
otomatik olarak akıllıca güncellerken, üretim modunda performansı en üst düzeye çıkarmaya odaklanır ve her kod
değişikliğinden sonra önbelleği temizlemek size bağlıdır. Silmeyi deneyin temp/cache
.
Hata 404, yönlendirme çalışmıyor
Tüm sayfalar (ana sayfa hariç) 404 hatası döndürdüğünde, güzel URL'ler için bir sunucu yapılandırma sorunu gibi görünür.
Geliştirme Sırasında Önbellek Nasıl Devre Dışı Bırakılır?
Nette akıllıdır ve içinde önbelleği devre dışı bırakmanıza gerek yoktur. Geliştirme sırasında, şablonda veya DI konteyner yapılandırmasında bir değişiklik olduğunda önbelleği otomatik olarak günceller. Dahası, geliştirme modu otomatik algılama ile etkinleştirilir, bu nedenle genellikle herhangi bir şeyi veya yalnızca IP adresini yapılandırmaya gerek yoktur.
Yönlendiricide hata ayıklarken, örneğin yönlendirmelerin depolanabileceği tarayıcı önbelleğini devre dışı bırakmanızı öneririz: Geliştirici Araçları'nı açın (Ctrl+Shift+I veya Cmd+Option+I) ve Ağ panelinde önbelleği devre dışı bırakmak için kutuyu işaretleyin.
Hata
#[\ReturnTypeWillChange] attribute should be used
Bu hata, PHP'yi 8.1 sürümüne yükselttiyseniz ancak onunla uyumlu olmayan Nette kullanıyorsanız ortaya çıkar. Çözüm,
composer update
adresini kullanarak Nette'yi daha yeni bir sürüme güncellemektir. Nette, PHP
8.1'i 3.0 sürümünden beri desteklemektedir. Daha eski bir sürüm kullanıyorsanız ( composer.json
adresine
bakarak öğrenebilirsiniz), Nette'yi yükseltin veya PHP 8.0 ile kalın.
Dizin İzinlerini Ayarlama
MacOS veya Linux (veya başka bir Unix tabanlı sistem) üzerinde geliştirme yapıyorsanız, web sunucusuna yazma
ayrıcalıklarını yapılandırmanız gerekir. Uygulamanızın varsayılan dizinde bulunduğunu varsayarsak
/var/www/html
(Fedora, CentOS, RHEL)
cd /var/www/html/MY_PROJECT
chmod -R a+rw temp log
Bazı Linux sistemlerinde (Fedora, CentOS, …) SELinux varsayılan olarak etkin olabilir. SELinux politikalarını
güncellemeniz veya temp
ve log
dizinlerinin yollarını doğru SELinux güvenlik bağlamı ile
ayarlamanız gerekebilir. temp
ve log
dizinleri httpd_sys_rw_content_t
bağlamına
ayarlanmalıdır; uygulamanın geri kalanı için – özellikle app
klasörü – httpd_sys_content_t
bağlamı yeterli olacaktır. Sunucu üzerinde root olarak çalıştırın:
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/
Daha sonra, Nette'nin ağ üzerinden veritabanına bağlanmasına izin vermek için SELinux boolean
httpd_can_network_connect_db
etkinleştirilmelidir. Varsayılan olarak devre dışıdır. Bu görevi
gerçekleştirmek için setsebool
komutu kullanılabilir ve -P
seçeneği belirtilirse, bu ayar yeniden
başlatmalarda kalıcı olacaktır.
setsebool -P httpd_can_network_connect_db on
URL'den www
Dizini Nasıl Değiştirilir veya
Kaldırılır?
Nette'deki örnek projelerde kullanılan www/
dizini, projenin genel dizini veya belge kökü olarak
adlandırılır. İçeriği tarayıcı tarafından erişilebilir olan tek dizindir. Ve Nette'de yazılmış bir web uygulamasını
başlatan giriş noktası olan index.php
dosyasını içerir.
Uygulamayı hosting üzerinde çalıştırmak için, hosting yapılandırmasında document-root'u bu dizine ayarlamanız
gerekir. Veya, barındırma, farklı bir adla (örneğin web
, public_html
vb.) genel dizin için
önceden oluşturulmuş bir klasöre sahipse, www/
adını değiştirmeniz yeterlidir.
Çözüm, .htaccess
dosyasındaki veya yönlendiricideki kuralları kullanarak www/
dışındaki tüm
klasörlere erişimi engellemek değildir. Barındırma hizmetiniz belge kökünü bir alt dizine ayarlamaya (yani genel
dizinin bir seviye üstünde dizinler oluşturmaya) izin vermiyorsa, farklı bir barındırma hizmeti aramalısınız. Aksi
takdirde, kendinizi önemli güvenlik risklerine maruz bırakmış olursunuz. Bu, ön kapısı kapatılamayan ve her zaman ardına
kadar açık olan bir apartman dairesinde yaşamaya benzer.
Güzel URL'ler için Sunucu Nasıl Yapılandırılır?
Apache: .htaccess
dosyasında mod_rewrite kurallarını etkinleştirmeniz ve ayarlamanız gerekir:
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]
Sorunlarla karşılaşırsanız, şunlardan emin olun:
.htaccess
dosyasının document-root dizininde bulunduğundan (yaniindex.php
dosyasının yanında)- Apache .htaccess dosyalarını işliyor
- mod_rewrite etkinleştirildi
Uygulamayı bir alt klasörde kuruyorsanız, RewriteBase
ayarı için satırı kaldırmanız ve doğru klasöre
ayarlamanız gerekebilir.
nginx: sunucu yapılandırmasında try_files
yönergesi kullanılmalıdır:
location / {
try_files $uri $uri/ /index.php$is_args$args; # $is_args$args ÖNEMLİDİR!
}
location
bloğu, server
bloğundaki her dosya sistemi yolu için tam olarak bir kez
tanımlanmalıdır. Yapılandırmanızda zaten bir location /
bloğu varsa, try_files
yönergesini
mevcut bloğa ekleyin.
.htaccess
'un çalışıp çalışmadığını test edin
Apache'nin .htaccess
dosyanızı kullanıp kullanmadığını ya da yok sayıp saymadığını test etmenin en
basit yolu, dosyayı kasıtlı olarak bozmaktır. Dosyanın başına Test
satırını koyun ve şimdi
tarayıcınızda sayfayı yenilediğinizde bir Internal Server Error görmelisiniz.
Eğer bu hatayı görüyorsanız, bu aslında iyi bir şey! Bu, Apache'nin .htaccess
dosyasını çözümlediği
ve oraya koyduğumuz hatayla karşılaştığı anlamına gelir. Test
satırını kaldırın.
Eğer bir Dahili Sunucu Hatası görmüyorsanız, Apache kurulumunuz .htaccess
dosyasını görmezden
geliyor demektir. Genel olarak, Apache eksik yapılandırma yönergesi AllowOverride All
nedeniyle bunu
yok sayar.
Eğer kendiniz barındırıyorsanız, bunu düzeltmek oldukça kolaydır. httpd.conf
veya apache.conf
adresinizi bir metin düzenleyicide açın, ilgili <Directory>
bölümünü açın ve yönergeyi
ekleyin/değiştirin:
<Directory "/var/www/htdocs"> # path to your document root
AllowOverride All
...
Siteniz başka bir yerde barındırılıyorsa, .htaccess
adresini etkinleştirip etkinleştiremeyeceğinizi
görmek için kontrol panelinizi kontrol edin. Değilse, bunu sizin için yapması için barındırma sağlayıcınızla
iletişime geçin.
mod_rewrite
'un etkin olup olmadığını test edin
.htaccess
'un çalıştığını doğruladıysanız, mod_rewrite
uzantısının etkin olduğunu doğrulayabilirsiniz. RewriteEngine On
satırını .htaccess
dosyasının
başına koyun ve tarayıcınızda sayfayı yenileyin. Eğer bir Internal Server Error görürseniz, bu mod_rewrite'ın
etkin olmadığı anlamına gelir. Etkinleştirmenin birkaç yolu vardır. Bunun farklı kurulumlarda yapılabileceği çeşitli
yollar için Stack Overflow'a bakın.
Bağlantılar https:
Olmadan Oluşturulur
Nette, geçerli sayfanın kullandığı protokolle aynı protokole sahip bağlantılar oluşturur. Yani
https://foo
ile başlayan bağlantılar oluşturur ve bunun tersi de geçerlidir. HTTPS sıyırıcı bir ters
proxy'nin arkasındaysanız (örneğin Docker'da), protokol algılamanın düzgün çalışması için yapılandırmada bir proxy ayarlamanız gerekir.
Nginx'i proxy olarak kullanıyorsanız, yeniden yönlendirmeyi şu şekilde ayarlamanız gerekir:
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
}
Ardından, IP proxy'sini ve varsa altyapıyı çalıştırdığınız yerel ağınızın IP aralığını belirtmeniz gerekir:
http:
proxy: IP-proxy/IP-range
JavaScript'te { } Karakterlerinin Kullanımı
{
and }
karakterleri Latte etiketlerini yazmak için kullanılır. {
character is
considered a tag. If you need to print character {
adresini takip eden her şey (boşluk ve tırnak işareti hariç)
(genellikle JavaScript'te), {
karakterinden hemen sonra bir boşluk (veya başka bir boş karakter) koyabilirsiniz.
Bu şekilde etiket olarak yorumlanmasını önlersiniz.
Bu karakterlerin bir etiket olarak yorumlanacağı bir durumda yazdırılması gerekiyorsa, bu karakterleri yazdırmak için
özel etiketler kullanabilirsiniz – {l}
için {
and {r}
}
için.
{is tag}
{ is not tag }
{l}is not tag{r}
Duyuru Presenter::getContext() is deprecated
Nette, bağımlılık enjeksiyonuna geçiş yapan ve programcıları sunum yapanlardan başlayarak tutarlı bir şekilde
kullanmaya yönlendiren ilk PHP çatısıdır. Eğer bir sunumcu bir bağımlılığa ihtiyaç duyarsa, bunu isteyecektir. Buna karşılık, tüm DI konteynerini bir sınıfa
aktarma ve bağımlılıkları doğrudan ondan çekme yöntemi bir antipattern olarak kabul edilir (buna servis bulucu denir). Bu
yol, bağımlılık enjeksiyonunun ortaya çıkmasından önce Nette 0.x'te kullanılıyordu ve kalıntısı, uzun zaman önce
kullanımdan kaldırılmış olarak işaretlenmiş olan Presenter::getContext()
yöntemidir.
Çok eski bir Nette uygulamasını taşırsanız, hala bu yöntemi kullandığını görebilirsiniz. Yani
nette/application
'un 3.1 sürümünden beri
Nette\Application\UI\Presenter::getContext() is deprecated, use dependency injection
uyarısıyla, 4.0 sürümünden
beri ise yöntemin mevcut olmadığı hatasıyla karşılaşırsınız.
Elbette temiz çözüm, bağımlılık enjeksiyonu kullanarak bağımlılıkları aktarmak için uygulamayı yeniden
tasarlamaktır. Geçici bir çözüm olarak, temel sunucunuza kendi getContext()
yönteminizi ekleyebilir ve mesajı
atlayabilirsiniz:
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;
}
}