Sorun Giderme
- Nette Çalışmıyor, Beyaz Sayfa Görünüyor
- Hata 500 Server Error: We're sorry! …
- Hata 404, Yönlendirme Çalışmıyor
- Şablonlardaki veya Yapılandırmadaki Değişiklikler Görünmüyor
- Geliştirme Sırasında Önbellek Nasıl Kapatılır?
- Hata #[\ReturnTypeWillChange] attribute should be used
- Dizin İzinlerini Ayarlama
- URL'den www Dizini Nasıl Değiştirilir veya Kaldırılır?
- Sunucu Kullanıcı Dostu URL'ler İçin Nasıl Ayarlanır?
- .htaccess'ın Çalıştığını Doğrulama
- mod_rewrite'ın Etkinleştirildiğini Doğrulama
- Bağlantılar https: Olmadan Oluşturuluyor
- JavaScript'te { } Karakterlerinin Kullanımı
- Presenter::getContext() is deprecated Mesajı
Nette Çalışmıyor, Beyaz Sayfa Görünüyor
index.php
dosyasınadeclare(strict_types=1);
satırından hemen sonraini_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:
- Barındırma yapılandırmasında document-root'u bu dizine ayarlayın
- 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:
.htaccess
dosyası document-root dizininde bulunur (yaniindex.php
dosyasının yanında)- Apache'nin
.htaccess
dosyalarını işlediğinden - mod_rewrite'ın etkinleştirildiğinden
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;
}
}