Sorun Giderme
- Nette Çalışmıyor, Beyaz Sayfa Görüntüleniyor
- Hata 500 Sunucu Hatası: Üzgünüz! …
- Hata #[\ReturnTypeWillChange] attribute should be used
- Dizin İzinlerini Ayarlama
- URL'den www Dizini Nasıl Değiştirilir veya Kaldırılır?
- Güzel URL'ler için Sunucu Nasıl Yapılandırılır?
- Bağlantılar https: Olmadan Oluşturulur
- JavaScript'te { } Karakterlerinin Kullanımı
- Duyuru Presenter::getContext() is deprecated
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. Bunu bir geliştirici makinesinde görüyorsanız, geliştirici moduna geçin.
Hata mesajı Tracy is unable to log error
içeriyorsa, hataların neden günlüğe kaydedilemediğini öğrenin.
Bunu, örneğin, geliştirici moduna geçerek ve
$configurator->enableTracy(...)
adresinden sonra Tracy\Debugger::log('hello');
adresini çağırarak
yapabilirsiniz. Tracy size neden günlüğe kaydedemediğini söyleyecektir. Bunun nedeni genellikle log/
dizinine
yazma izinlerinin yetersiz olmasıdır.
Eğer Tracy is unable to log error
cümlesi hata mesajında yer almıyorsa (artık), hatanın nedenini
log/
dizinindeki günlükten öğrenebilirsiniz.
En yaygın nedenlerden biri eski bir önbellektir. Nette, geliştirme modunda önbelleği akıllıca otomatik olarak
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. temp/cache
adresini silmeyi deneyin.
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/
klasöründen
“kurtulmak” değildir. Hosting, document-root'u bir alt dizine ayarlamanıza (yani genel dizinin bir seviye üstünde
dizinler oluşturmanıza) izin vermiyorsa, başka bir tane arayın. Aksi takdirde önemli bir güvenlik riski almış olursunuz.
Bu, ön kapısını kapatamadığınız 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: mod_rewrite uzantısına izin verilmeli ve .htaccess
dosyasında yapılandırılmalıdır.
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]
Apache yapılandırmasını .htaccess dosyaları ile değiştirmek için AllowOverride yönergesi etkinleştirilmelidir. Bu Apache için öntanımlı davranıştır.
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 is important
}
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.
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;
}
}