Nette Documentation Preview

syntax
Sorun Giderme
*************


Nette Çalışmıyor, Beyaz Sayfa Görüntüleniyor .[#toc-nette-is-not-working-white-page-is-displayed]
-------------------------------------------------------------------------------------------------
- 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! ...* .[#toc-error-500-server-error-we-re-sorry]
---------------------------------------------------------------------------------
Bu hata sayfası Nette tarafından üretim modunda görüntülenir. Geliştirme makinenizde görürseniz, [geliştirici moduna geçin |application:bootstrap#Development vs Production Mode] 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 |application:bootstrap#Development vs Production Mode] ve Tracy'nin başlatıldıktan sonra herhangi bir şeyi günlüğe kaydetmesine izin vererek yapabilirsiniz:

```php
// 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 |#Setting Directory Permissions] 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 .[#toc-error-404-routing-not-working]
----------------------------------------------------------------------
Tüm sayfalar (ana sayfa hariç) 404 hatası döndürdüğünde, [güzel URL' |#How to Configure a Server for Nice URLs?]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? .[#toc-how-to-disable-cache-during-development]
---------------------------------------------------------------------------------------------------------
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 |application:bootstrap#development-vs-production-mode] 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` .[#toc-error-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 |migrations:en] veya PHP 8.0 ile kalın.


Dizin İzinlerini Ayarlama .[#toc-setting-directory-permissions]
---------------------------------------------------------------
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)

```shell
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:

```shell
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.

```shell
setsebool -P httpd_can_network_connect_db on
```


URL'den `www` Dizini Nasıl Değiştirilir veya Kaldırılır? .[#toc-how-to-change-or-remove-www-directory-from-url]
---------------------------------------------------------------------------------------------------------------
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? .[#toc-how-to-configure-a-server-for-nice-urls]
-----------------------------------------------------------------------------------------------
**Apache**: `.htaccess` dosyasında mod_rewrite kurallarını etkinleştirmeniz ve ayarlamanız gerekir:

```apacheconf
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 (yani `index.php` dosyasının yanında)
- [Apache .htaccess dosyalarını işliyor |#Test if .htaccess is working]
- [mod_rewrite etkinleştirildi |#Test if mod_rewrite is enabled]

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:

```nginx
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 .[#toc-test-if-htaccess-is-working]
-----------------------------------------------------------------------------------
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:

```apacheconf
<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 .[#toc-test-if-mod-rewrite-is-enabled]
----------------------------------------------------------------------------------------
[`.htaccess` 'un çalıştığını |#Test if .htaccess is working] 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 .[#toc-links-are-generated-without-https]
----------------------------------------------------------------------------------
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 |http:configuration#HTTP proxy] 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:

```neon
http:
	proxy: IP-proxy/IP-range
```


JavaScript'te { } Karakterlerinin Kullanımı .[#toc-use-of-characters-in-javascript]
-----------------------------------------------------------------------------------
`{` 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` .[#toc-notice-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 |dependency-injection:passing-dependencies].
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:

```php
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;
	}
}
```


{{leftbar: www:@menu-common}}

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. 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:

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.

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;
	}
}