Sorun Giderme

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

  • Hataların görüntülenmesini zorlamak için index.php dosyasında declare(strict_types=1); adresinden sonra ini_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.

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;
	}
}
versiyon: 4.0