Sorun Giderme

Nette Çalışmıyor, Beyaz Sayfa Görünüyor

  • index.php dosyasına declare(strict_types=1); satırından hemen sonra ini_set('display_errors', '1'); error_reporting(E_ALL); eklemeyi deneyin, bu hataların görüntülenmesini zorlar
  • Hala beyaz bir ekran görüyorsanız, muhtemelen sunucu ayarlarında bir hata vardır ve nedeni sunucu günlüğünde ortaya çıkacaktır. Emin olmak için, echo 'test'; kullanarak bir şeyler yazdırmayı deneyerek PHP'nin çalışıp çalışmadığını kontrol edin
  • Server Error: We're sorry! … hatasını görüyorsanız, sonraki bölümle devam edin:

Hata 500 Server Error: We're sorry! …

Bu hata sayfası Nette tarafından üretim modunda görüntülenir. Geliştirici bilgisayarınızda görüntüleniyorsa, geliştirme moduna geçin ve ayrıntılı bir mesaj içeren Tracy hata ayıklama aracı görüntülenecektir.

Hatanın nedeni her zaman log/ dizinindeki günlükte okunabilir. Ancak hata mesajında Tracy is unable to log error cümlesi görünüyorsa, önce hataların neden günlüğe kaydedilemediğini öğrenin. Bunu, örneğin geçici olarak geliştirme moduna geçerek ve Tracy'nin başlatıldıktan sonra herhangi bir şeyi günlüğe kaydetmesini sağlayarak yapabilirsiniz:

// Bootstrap.php
$configurator->setDebugMode('23.75.345.200'); // IP adresiniz
$configurator->enableTracy($rootDir . '/log');
\Tracy\Debugger::log('hello');

Tracy size neden günlük kaydı yapamadığını söyleyecektir. Nedeni muhtemelen log/ dizinine yazmak için yetersiz izinler olabilir.

500 hatasının en yaygın nedenlerinden biri eski ö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 kalmıştır. temp/cache'i silmeyi deneyin.

Hata 404, Yönlendirme Çalışmıyor

Tüm sayfalar (ana sayfa hariç) 404 hatası veriyorsa, bu durum sunucunun kullanıcı dostu URL'ler için yapılandırılmasıyla ilgili bir soruna işaret ediyor olabilir.

Şablonlardaki veya Yapılandırmadaki Değişiklikler Görünmüyor

“Şablonu veya yapılandırmayı düzenledim, ancak web sitesi hala eski sürümü gösteriyor.” Bu davranış, performans nedeniyle dosyalardaki değişiklikleri kontrol etmeyen ve bir kez oluşturulan önbelleği koruyan üretim modunda meydana gelir.

Üretim sunucusunda her düzenlemeden sonra önbelleği manuel olarak silmek zorunda kalmamak için, Bootstrap.php dosyasında IP adresiniz için geliştirme modunu etkinleştirin:

$this->configurator->setDebugMode('sizin.ip.adresiniz');

Geliştirme Sırasında Önbellek Nasıl Kapatılır?

Nette akıllıdır ve içinde önbelleğe almayı kapatmanız gerekmez. Geliştirme sırasında, şablonun veya DI konteyner yapılandırmasının her değişikliğinde önbelleği otomatik olarak günceller. Geliştirme modu ayrıca otomatik algılama ile etkinleştirilir, bu nedenle genellikle hiçbir şeyi yapılandırmaya gerek yoktur, veya sadece IP adresini.

Yönlendiriciyi hata ayıklarken, tarayıcıdaki önbelleği kapatmanızı öneririz, örneğin yönlendirmeler burada saklanabilir: Geliştirici Araçları'nı açın (Ctrl+Shift+I veya Cmd+Option+I) ve Ağ (Network) panelinde önbelleği kapatmayı işaretleyin.

Hata #[\ReturnTypeWillChange] attribute should be used

Bu hata, PHP'yi 8.1 sürümüne güncellediyseniz ancak onunla uyumlu olmayan bir Nette kullanıyorsanız ortaya çıkar. Çözüm, Nette'yi composer update kullanarak daha yeni bir sürüme güncellemektir. Nette, 3.0 sürümünden itibaren PHP 8.1'i destekler. Daha eski bir sürüm kullanıyorsanız ( composer.json'a bakarak öğrenin), Nette'yi yükseltin veya PHP 8.0'da kalın.

Dizin İzinlerini Ayarlama

macOS veya Linux üzerinde (veya Unix tabanlı başka bir sistemde) geliştirme yapıyorsanız, web sunucusuna yazma izinleri ayarlamanız gerekecektir. Uygulamanızın varsayılan /var/www/html (Fedora, CentOS, RHEL) içinde bulunduğunu varsayalım.

cd /var/www/html/MY_PROJECT
chmod -R a+rw temp log

Bazı Linux'larda (Fedora, CentOS, …) SELinux varsayılan olarak etkindir. SELinux politikalarını uygun şekilde düzenlemeniz ve temp ve log klasörleri için doğru SELinux güvenlik bağlamını ayarlamanız gerekecektir. temp ve log için httpd_sys_rw_content_t bağlam türünü ayarlayacağız, uygulamanın geri kalanı (ve özellikle app klasörü) için httpd_sys_content_t yeterli olacaktır. Sunucuda şunu ç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/

Ayrıca, varsayılan olarak kapalı olan ve Nette'nin ağ üzerinden veritabanına bağlanmasına izin veren httpd_can_network_connect_db SELinux boolean'ını etkinleştirmek gerekir. Bunun için setsebool komutunu ve -P seçeneğini kullanarak değişikliği kalıcı hale getireceğiz, yani sunucuyu yeniden başlattıktan sonra hoş olmayan bir sürprizle karşılaşmayacağız:

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 sözde genel dizini veya document-root'unu temsil eder. İçeriği tarayıcı tarafından erişilebilen tek dizindir. Ve Nette'de yazılmış web uygulamasını başlatan giriş noktası olan index.php dosyasını içerir.

Uygulamayı barındırmada çalıştırmak için document-root'un doğru şekilde yapılandırılması gerekir. İki seçeneğiniz var:

  1. Barındırma yapılandırmasında document-root'u bu dizine ayarlayın
  2. Barındırmanın önceden hazırlanmış bir klasörü varsa (örneğin public_html), www/'yi bu adla yeniden adlandırın

Güvenliği yalnızca diğer klasörlere erişimi engelleyecek .htaccess veya yönlendirici ile çözmeye asla çalışmayın.

Barındırma, document-root'u bir alt dizine ayarlamaya izin vermiyorsa (yani genel dizinin bir seviye üzerinde dizinler oluşturmaya), başka bir tane arayın. Aksi takdirde önemli bir güvenlik riskiyle karşı karşıya kalırsınız. Bu, giriş kapısı kapatılamayan ve her zaman ardına kadar açık olan bir dairede yaşamak gibi olurdu.

Sunucu Kullanıcı Dostu URL'ler İçin Nasıl Ayarlanır?

Apache: .htaccess dosyasında mod_rewrite kurallarını etkinleştirmek ve ayarlamak 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:

Uygulamayı bir alt klasörde ayarlıyorsanız, RewriteBase ayarı için satırın yorumunu kaldırmanız ve doğru klasöre ayarlamanız gerekebilir.

nginx: sunucu yapılandırmasındaki location / bloğunun içinde try_files yönergesini kullanarak yönlendirmeyi ayarlamak gerekir.

location / {
	try_files $uri $uri/ /index.php$is_args$args;  # $is_args$args ÖNEMLİDİR!
}

location bloğu, server bloğu içinde her dosya sistemi yolu için yalnızca bir kez bulunabilir. Yapılandırmanızda zaten location / varsa, try_files yönergesini ona ekleyin.

.htaccess'ın Çalıştığını Doğrulama

Apache'nin .htaccess dosyanızı kullanıp kullanmadığını veya yok sayıp saymadığını test etmenin en kolay yolu, onu kasıtlı olarak bozmaktır. Dosyanın başına Test satırını ekleyin ve şimdi tarayıcıda sayfayı yenilerseniz, Internal Server Error görmelisiniz.

Bu hatayı görürseniz, bu aslında iyi bir şeydir! Apache'nin .htaccess dosyasını analiz ettiği ve oraya eklediğimiz hatayla karşılaştığı anlamına gelir. Test satırını kaldırın.

Internal Server Error görüntülenmezse, Apache ayarınız .htaccess dosyasını yok sayıyor demektir. Genel olarak Apache, eksik AllowOverride All yapılandırma yönergesi nedeniyle onu yok sayar.

Kendiniz barındırıyorsanız, bunu kolayca düzeltebilirsiniz. httpd.conf veya apache.conf dosyasını bir metin düzenleyicide açın, ilgili <Directory> bölümünü bulun ve bu yönergeyi ekleyin/değiştirin:

<Directory "/var/www/htdocs"> # belge kök dizininizin yolu
    AllowOverride All
    ...

Web siteniz başka bir yerde barındırılıyorsa, .htaccess dosyasını etkinleştirip etkinleştiremeyeceğinizi görmek için kontrol panelinize bakın. Değilse, bunu sizin için yapması için barındırma sağlayıcınızla iletişime geçin.

mod_rewrite'ın Etkinleştirildiğini Doğrulama

.htaccess'ın çalıştığını doğruladıysanız, mod_rewrite uzantısının etkinleştirilip etkinleştirilmediğini doğrulayabilirsiniz. .htaccess dosyasının başına RewriteEngine On satırını ekleyin ve tarayıcıda sayfayı yenileyin. Internal Server Error görüntülenirse, bu mod_rewrite'ın etkinleştirilmediği anlamına gelir. Etkinleştirmenin birkaç yolu vardır. Farklı ayarlarda bunu yapmanın çeşitli yollarını Stack Overflow'da bulabilirsiniz.

Bağlantılar https: Olmadan Oluşturuluyor

Nette, bağlantıları sayfanın kendisiyle aynı protokolle oluşturur. Yani https://foo sayfasında https: ile başlayan bağlantılar oluşturur ve tersi de geçerlidir. HTTPS'yi kaldıran bir ters proxy sunucusunun arkasındaysanız (örneğin Docker'da), protokol algılamasının doğru çalışması için yapılandırmada proxy'yi yapılandırmak gerekir.

Proxy olarak Nginx kullanıyorsanız, yönlendirmenin örneğin şu şekilde ayarlanması 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;  # Uygulamanın çalıştığı sunucunun/konteynerin IP'si veya ana bilgisayar adı
}

Ayrıca, yapılandırmaya proxy'nin IP'sini ve muhtemelen 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ı

{ ve } karakterleri Latte etiketlerini yazmak için kullanılır. Boşluk ve tırnak işareti hariç { karakterini takip eden her şey etiket olarak alınır. Bu nedenle doğrudan { karakterini yazdırmanız gerekiyorsa (genellikle örneğin JavaScript'te), { karakterinden sonra bir boşluk (veya başka bir boş karakter) koyabilirsiniz. Bu, etiket olarak çevrilmesini önler.

Metnin etiket olarak anlaşılacağı bir durumda bu karakterleri yazdırmak gerekirse, bu karakterleri yazdırmak için özel etiketler kullanabilirsiniz – { için {l} ve } için {r}.

{bu bir etikettir}
{ bu bir etiket değildir }
{l}bu bir etiket değildir{r}

Presenter::getContext() is deprecated Mesajı

Nette, dependency injection'a geçen ve programcıları presenter'lardan başlayarak tutarlı bir şekilde kullanmaya yönlendiren açık ara ilk PHP framework'üdür. Presenter'ın bir bağımlılığa ihtiyacı varsa, onu talep eder. Aksine, sınıfa tüm DI konteynerini ilettiğimiz ve sınıfın bağımlılıkları doğrudan ondan çektiği yol, bir antipattern olarak kabul edilir (service locator olarak adlandırılır). Bu yöntem, dependency injection'ın gelmesinden önce Nette 0.x'te kullanılıyordu ve kalıntısı, uzun zaman önce deprecated olarak işaretlenen Presenter::getContext() metodudur.

Nette için çok eski bir uygulamayı taşıyorsanız, hala bu metodu kullandığını görebilirsiniz. nette/application sürüm 3.1'den itibaren Nette\Application\UI\Presenter::getContext() is deprecated, use dependency injection uyarısıyla, sürüm 4.0'dan itibaren ise metodun mevcut olmadığı hatasıyla karşılaşırsınız.

Temiz çözüm elbette uygulamayı dependency injection kullanarak bağımlılıkları iletecek şekilde yeniden düzenlemektir. Bir geçici çözüm olarak, temel presenter'ınıza kendi getContext() metodunuzu ekleyebilir ve böylece 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;
	}
}
versiyon: 4.0