Nette Documentation Preview

syntax
Nasıl Yapılır Kılavuzları
*************************


İçerik Güvenlik Politikası (Content Security Policy)
====================================================

Web siteniz İçerik Güvenlik Politikası kullanıyorsa, Tracy'nin düzgün çalışması için `script-src`'ye aynı `'nonce-<value>'` ve `'strict-dynamic'` eklemeniz gerekecektir. Bazı üçüncü taraf eklentiler ek ayarlar gerektirebilir. Nonce, `style-src` yönergesinde desteklenmez; bu yönergeyi kullanıyorsanız `'unsafe-inline'` eklemeniz gerekir, ancak üretim modunda bundan kaçınmalısınız.

[Nette Framework |nette:configuring] için örnek yapılandırma:

```neon
http:
	csp:
		script-src: [nonce, strict-dynamic]
```

Saf PHP'de örnek:

```php
$nonce = base64_encode(random_bytes(20));
header("Content-Security-Policy: script-src 'nonce-$nonce' 'strict-dynamic';");
```


Daha Hızlı Yükleme
==================

Başlatma basittir, ancak web sayfanızda yavaş yüklenen engelleyici betikler varsa, Tracy'nin yüklenmesini yavaşlatabilirler. Çözüm, `<?php Tracy\Debugger::renderLoader() ?>` öğesini şablonunuza tüm betiklerden önce yerleştirmektir:

```latte
<!DOCTYPE html>
<html>
<head>
	<title>...</title>
	<?php Tracy\Debugger::renderLoader() ?>
	<link rel="stylesheet" href="assets/style.css">
	<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
```


AJAX İsteklerinde Hata Ayıklama
===============================

Tracy, jQuery veya yerel `fetch` API kullanılarak oluşturulan AJAX isteklerini otomatik olarak yakalar. İstekler, Tracy çubuğunda ek satırlar olarak görüntülenir, bu da AJAX'ın kolay ve rahat bir şekilde hata ayıklanmasını sağlar.

AJAX isteklerini otomatik olarak yakalamak istemiyorsanız, JavaScript değişkenini ayarlayarak bu özelliği devre dışı bırakabilirsiniz:

```js
window.TracyAutoRefresh = false;
```

Belirli AJAX isteklerini manuel olarak izlemek için, `Tracy.getAjaxHeader()` tarafından döndürülen değerle `X-Tracy-Ajax` HTTP başlığını ekleyin. İşte `fetch` fonksiyonuyla bir kullanım örneği:

```js
fetch(url, {
    headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'X-Tracy-Ajax': Tracy.getAjaxHeader(),
    }
})
```

Bu yaklaşım, AJAX isteklerinin seçici olarak hata ayıklanmasını sağlar.


Veri Depolama
=============

Tracy, AJAX istekleri ve yönlendirmeler için Tracy çubuğunda ve Bluescreen'lerde panelleri görüntüleyebilir. Tracy kendi oturumunu oluşturur, verileri kendi geçici dosyalarında saklar ve `tracy-session` çerezini kullanır.

Tracy, Tracy'yi açmadan önce başlattığımız yerel PHP oturumunu kullanacak şekilde de yapılandırılabilir:

```php
session_start();
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();
```

Oturumun başlatılması daha karmaşık bir başlatma gerektiriyorsa, Tracy'yi hemen başlatabilir (oluşabilecek hataları işleyebilmesi için), ardından oturum işleyicisini başlatabilir ve son olarak `dispatch()` fonksiyonunu kullanarak oturumun kullanıma hazır olduğunu Tracy'ye bildirebilirsiniz:

```php
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();

// oturum başlatma işlemi takip eder
// ve oturumun başlatılması
session_start();

Debugger::dispatch();
```

`setSessionStorage()` fonksiyonu sürüm 2.9'dan beri mevcuttur, daha önce Tracy her zaman yerel PHP oturumunu kullanıyordu.


Özel Temizleyici (Scrubber)
===========================

Scrubber, döküm sırasında parolalar veya erişim kimlik bilgileri gibi hassas verilerin sızmasını önleyen bir filtredir. Filtre, dökümü yapılan dizinin veya nesnenin her öğesi için çağrılır ve değer hassas ise `true` döndürür. Bu durumda, değer yerine `*****` yazdırılır.

```php
// `password`, `password_repeat`, `check_password`, `DATABASE_PASSWORD` gibi anahtarların
// ve özelliklerin değerlerinin yazdırılmasını engeller.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// BlueScreen içindeki tüm dökümler için kullanacağız
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;
```


Özel Logger
===========

Hataları, yakalanmamış istisnaları günlüğe kaydedecek ve ayrıca `Tracy\Debugger::log()` metodu tarafından çağrılacak kendi logger'ımızı oluşturabiliriz. Logger, [api:Tracy\ILogger] arayüzünü uygular.

```php
use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// Slack'e istek gönderir
	}
}
```

Ve ardından etkinleştiririz:

```php
Tracy\Debugger::setLogger(new SlackLogger);
```

Tam Nette Framework kullanıyorsak, bunu yapılandırma NEON dosyasında ayarlayabilirsiniz:

```neon
services:
	tracy.logger: SlackLogger
```


Monolog Entegrasyonu
--------------------

Tracy paketi, [monolog/monolog](https://github.com/Seldaek/monolog) entegrasyonunu sağlayan bir PSR-3 adaptörü sunar.

```php
$monolog = new Monolog\Logger('main-channel');
$monolog->pushHandler(new Monolog\Handler\StreamHandler($logFilePath, Monolog\Logger::DEBUG));

$tracyLogger = new Tracy\Bridges\Psr\PsrToTracyLoggerAdapter($monolog);
Debugger::setLogger($tracyLogger);
Debugger::enable();

Debugger::log('info'); // yazar: [<TIMESTAMP>] main-channel.INFO: info [] []
Debugger::log('warning', Debugger::WARNING); // yazar: [<TIMESTAMP>] main-channel.WARNING: warning [] []
```


nginx
=====

Tracy nginx sunucusunda çalışmıyorsa, muhtemelen yanlış yapılandırılmıştır. Yapılandırmada şöyle bir şey varsa:

```nginx
try_files $uri $uri/ /index.php;
```

şuna değiştirin:

```nginx
try_files $uri $uri/ /index.php$is_args$args;
```

Nasıl Yapılır Kılavuzları

İçerik Güvenlik Politikası (Content Security Policy)

Web siteniz İçerik Güvenlik Politikası kullanıyorsa, Tracy'nin düzgün çalışması için script-src'ye aynı 'nonce-<value>' ve 'strict-dynamic' eklemeniz gerekecektir. Bazı üçüncü taraf eklentiler ek ayarlar gerektirebilir. Nonce, style-src yönergesinde desteklenmez; bu yönergeyi kullanıyorsanız 'unsafe-inline' eklemeniz gerekir, ancak üretim modunda bundan kaçınmalısınız.

Nette Framework için örnek yapılandırma:

http:
	csp:
		script-src: [nonce, strict-dynamic]

Saf PHP'de örnek:

$nonce = base64_encode(random_bytes(20));
header("Content-Security-Policy: script-src 'nonce-$nonce' 'strict-dynamic';");

Daha Hızlı Yükleme

Başlatma basittir, ancak web sayfanızda yavaş yüklenen engelleyici betikler varsa, Tracy'nin yüklenmesini yavaşlatabilirler. Çözüm, <?php Tracy\Debugger::renderLoader() ?> öğesini şablonunuza tüm betiklerden önce yerleştirmektir:

<!DOCTYPE html>
<html>
<head>
	<title>...</title>
	<?php Tracy\Debugger::renderLoader() ?>
	<link rel="stylesheet" href="assets/style.css">
	<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>

AJAX İsteklerinde Hata Ayıklama

Tracy, jQuery veya yerel fetch API kullanılarak oluşturulan AJAX isteklerini otomatik olarak yakalar. İstekler, Tracy çubuğunda ek satırlar olarak görüntülenir, bu da AJAX'ın kolay ve rahat bir şekilde hata ayıklanmasını sağlar.

AJAX isteklerini otomatik olarak yakalamak istemiyorsanız, JavaScript değişkenini ayarlayarak bu özelliği devre dışı bırakabilirsiniz:

window.TracyAutoRefresh = false;

Belirli AJAX isteklerini manuel olarak izlemek için, Tracy.getAjaxHeader() tarafından döndürülen değerle X-Tracy-Ajax HTTP başlığını ekleyin. İşte fetch fonksiyonuyla bir kullanım örneği:

fetch(url, {
    headers: {
        'X-Requested-With': 'XMLHttpRequest',
        'X-Tracy-Ajax': Tracy.getAjaxHeader(),
    }
})

Bu yaklaşım, AJAX isteklerinin seçici olarak hata ayıklanmasını sağlar.

Veri Depolama

Tracy, AJAX istekleri ve yönlendirmeler için Tracy çubuğunda ve Bluescreen'lerde panelleri görüntüleyebilir. Tracy kendi oturumunu oluşturur, verileri kendi geçici dosyalarında saklar ve tracy-session çerezini kullanır.

Tracy, Tracy'yi açmadan önce başlattığımız yerel PHP oturumunu kullanacak şekilde de yapılandırılabilir:

session_start();
Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();

Oturumun başlatılması daha karmaşık bir başlatma gerektiriyorsa, Tracy'yi hemen başlatabilir (oluşabilecek hataları işleyebilmesi için), ardından oturum işleyicisini başlatabilir ve son olarak dispatch() fonksiyonunu kullanarak oturumun kullanıma hazır olduğunu Tracy'ye bildirebilirsiniz:

Debugger::setSessionStorage(new Tracy\NativeSession);
Debugger::enable();

// oturum başlatma işlemi takip eder
// ve oturumun başlatılması
session_start();

Debugger::dispatch();

setSessionStorage() fonksiyonu sürüm 2.9'dan beri mevcuttur, daha önce Tracy her zaman yerel PHP oturumunu kullanıyordu.

Özel Temizleyici (Scrubber)

Scrubber, döküm sırasında parolalar veya erişim kimlik bilgileri gibi hassas verilerin sızmasını önleyen bir filtredir. Filtre, dökümü yapılan dizinin veya nesnenin her öğesi için çağrılır ve değer hassas ise true döndürür. Bu durumda, değer yerine ***** yazdırılır.

// `password`, `password_repeat`, `check_password`, `DATABASE_PASSWORD` gibi anahtarların
// ve özelliklerin değerlerinin yazdırılmasını engeller.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// BlueScreen içindeki tüm dökümler için kullanacağız
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;

Özel Logger

Hataları, yakalanmamış istisnaları günlüğe kaydedecek ve ayrıca Tracy\Debugger::log() metodu tarafından çağrılacak kendi logger'ımızı oluşturabiliriz. Logger, Tracy\ILogger arayüzünü uygular.

use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// Slack'e istek gönderir
	}
}

Ve ardından etkinleştiririz:

Tracy\Debugger::setLogger(new SlackLogger);

Tam Nette Framework kullanıyorsak, bunu yapılandırma NEON dosyasında ayarlayabilirsiniz:

services:
	tracy.logger: SlackLogger

Monolog Entegrasyonu

Tracy paketi, monolog/monolog entegrasyonunu sağlayan bir PSR-3 adaptörü sunar.

$monolog = new Monolog\Logger('main-channel');
$monolog->pushHandler(new Monolog\Handler\StreamHandler($logFilePath, Monolog\Logger::DEBUG));

$tracyLogger = new Tracy\Bridges\Psr\PsrToTracyLoggerAdapter($monolog);
Debugger::setLogger($tracyLogger);
Debugger::enable();

Debugger::log('info'); // yazar: [<TIMESTAMP>] main-channel.INFO: info [] []
Debugger::log('warning', Debugger::WARNING); // yazar: [<TIMESTAMP>] main-channel.WARNING: warning [] []

nginx

Tracy nginx sunucusunda çalışmıyorsa, muhtemelen yanlış yapılandırılmıştır. Yapılandırmada şöyle bir şey varsa:

try_files $uri $uri/ /index.php;

şuna değiştirin:

try_files $uri $uri/ /index.php$is_args$args;