Nette Documentation Preview

syntax
Rețete
******


Politica de securitate a conținutului .[#toc-content-security-policy]
=====================================================================

Dacă site-ul dvs. utilizează Content Security Policy, va trebui să adăugați `'nonce-<value>'` și `'strict-dynamic'` la `script-src` pentru ca Tracy să funcționeze corect. Este posibil ca unele pluginuri terțe să necesite directive suplimentare.
Nonce nu este acceptat în directiva `style-src`, dacă utilizați această directivă trebuie să adăugați `'unsafe-inline'`, dar acest lucru ar trebui evitat în modul de producție.

Exemplu de configurare pentru [Nette Framework |nette:configuring]:

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

Exemplu în PHP pur:

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


Încărcare mai rapidă .[#toc-faster-loading]
===========================================

Integrarea de bază este simplă, însă dacă aveți scripturi lente de blocare în pagina web, acestea pot încetini încărcarea Tracy.
Soluția este să plasați `<?php Tracy\Debugger::renderLoader() ?>` în șablonul dvs. înainte de orice script:

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


Depanarea cererilor AJAX .[#toc-debugging-ajax-requests]
========================================================

Tracy captează automat solicitările AJAX efectuate cu ajutorul jQuery sau al API-ului nativ `fetch`. Aceste cereri sunt afișate ca rânduri suplimentare în bara Tracy, permițând o depanare AJAX ușoară și convenabilă.

Dacă nu doriți să capturați automat solicitările AJAX, puteți dezactiva această funcție prin setarea variabilei JavaScript:

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

Pentru monitorizarea manuală a unor cereri AJAX specifice, adăugați antetul HTTP `X-Tracy-Ajax` cu valoarea returnată de `Tracy.getAjaxHeader()`. Iată un exemplu de utilizare a acestuia cu funcția `fetch`:

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

Această abordare permite depanarea selectivă a cererilor AJAX.


Stocarea datelor .[#toc-data-storage]
=====================================

Tracy poate afișa panouri de bare Tracy și Bluescreens pentru cereri AJAX și redirecționări. Tracy își creează propriile sesiuni, stochează datele în propriile fișiere temporare și utilizează un cookie `tracy-session`.

Tracy poate fi configurat, de asemenea, să utilizeze o sesiune PHP nativă, care este inițiată înainte ca Tracy să fie pornit:

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

În cazul în care pornirea unei sesiuni necesită o inițializare mai complexă, puteți porni Tracy imediat (pentru ca acesta să poată gestiona orice erori care apar) și apoi să inițializați gestionarul de sesiune și, în final, să îl informați pe Tracy că sesiunea este pregătită pentru a fi utilizată utilizând funcția `dispatch()`:

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

// urmată de inițializarea sesiunii
// și începe sesiunea
session_start();

Debugger::dispatch();
```

Funcția `setSessionStorage()` există de la versiunea 2.9, înainte de aceasta Tracy folosea întotdeauna sesiunea nativă PHP.


Scrubber personalizat .[#toc-custom-scrubber]
=============================================

Scrubber este un filtru care previne scurgerea datelor sensibile, cum ar fi parolele sau acreditările. Filtrul este apelat pentru fiecare element din matricea sau obiectul descărcat și returnează `true` dacă valoarea este sensibilă. În acest caz, în locul valorii se tipărește `*****`.

```php
// evită descărcarea valorilor cheilor și a proprietăților precum `password`,
// `password_repeat`, `check_password`, `DATABASE_PASSWORD`, etc.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// îl folosim pentru toate descărcările din BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;
```


Logger personalizat .[#toc-custom-logger]
=========================================

Putem crea un logger personalizat pentru a înregistra erori, excepții neacoperite și, de asemenea, pentru a fi apelat de `Tracy\Debugger::log()`. Logger implementează interfața [api:Tracy\ILogger].

```php
use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// trimite o cerere către Slack
	}
}
```

Și apoi îl activăm:

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

Dacă folosim Nette Framework complet, îl putem seta în fișierul de configurare NEON:

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


Monolog Integration .[#toc-monolog-integration]
-----------------------------------------------

Pachetul Tracy oferă un adaptor PSR-3, care permite integrarea [monolog/monolog](https://github.com/Seldaek/monolog).

```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'); // scrie: [<TIMESTAMP>] main-channel.INFO: info [] [] []
Debugger::log('warning', Debugger::WARNING); // scrie: [<TIMESTAMP>] main-channel.WARNING: warning [] [] []
```


nginx .[#toc-nginx]
===================

Dacă Tracy nu funcționează pe nginx, probabil că este configurat greșit. Dacă există ceva de genul

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

schimbați-l cu

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

Rețete

Politica de securitate a conținutului

Dacă site-ul dvs. utilizează Content Security Policy, va trebui să adăugați 'nonce-<value>' și 'strict-dynamic' la script-src pentru ca Tracy să funcționeze corect. Este posibil ca unele pluginuri terțe să necesite directive suplimentare. Nonce nu este acceptat în directiva style-src, dacă utilizați această directivă trebuie să adăugați 'unsafe-inline', dar acest lucru ar trebui evitat în modul de producție.

Exemplu de configurare pentru Nette Framework:

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

Exemplu în PHP pur:

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

Încărcare mai rapidă

Integrarea de bază este simplă, însă dacă aveți scripturi lente de blocare în pagina web, acestea pot încetini încărcarea Tracy. Soluția este să plasați <?php Tracy\Debugger::renderLoader() ?> în șablonul dvs. înainte de orice script:

<!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>

Depanarea cererilor AJAX

Tracy captează automat solicitările AJAX efectuate cu ajutorul jQuery sau al API-ului nativ fetch. Aceste cereri sunt afișate ca rânduri suplimentare în bara Tracy, permițând o depanare AJAX ușoară și convenabilă.

Dacă nu doriți să capturați automat solicitările AJAX, puteți dezactiva această funcție prin setarea variabilei JavaScript:

window.TracyAutoRefresh = false;

Pentru monitorizarea manuală a unor cereri AJAX specifice, adăugați antetul HTTP X-Tracy-Ajax cu valoarea returnată de Tracy.getAjaxHeader(). Iată un exemplu de utilizare a acestuia cu funcția fetch:

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

Această abordare permite depanarea selectivă a cererilor AJAX.

Stocarea datelor

Tracy poate afișa panouri de bare Tracy și Bluescreens pentru cereri AJAX și redirecționări. Tracy își creează propriile sesiuni, stochează datele în propriile fișiere temporare și utilizează un cookie tracy-session.

Tracy poate fi configurat, de asemenea, să utilizeze o sesiune PHP nativă, care este inițiată înainte ca Tracy să fie pornit:

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

În cazul în care pornirea unei sesiuni necesită o inițializare mai complexă, puteți porni Tracy imediat (pentru ca acesta să poată gestiona orice erori care apar) și apoi să inițializați gestionarul de sesiune și, în final, să îl informați pe Tracy că sesiunea este pregătită pentru a fi utilizată utilizând funcția dispatch():

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

// urmată de inițializarea sesiunii
// și începe sesiunea
session_start();

Debugger::dispatch();

Funcția setSessionStorage() există de la versiunea 2.9, înainte de aceasta Tracy folosea întotdeauna sesiunea nativă PHP.

Scrubber personalizat

Scrubber este un filtru care previne scurgerea datelor sensibile, cum ar fi parolele sau acreditările. Filtrul este apelat pentru fiecare element din matricea sau obiectul descărcat și returnează true dacă valoarea este sensibilă. În acest caz, în locul valorii se tipărește *****.

// evită descărcarea valorilor cheilor și a proprietăților precum `password`,
// `password_repeat`, `check_password`, `DATABASE_PASSWORD`, etc.
$scrubber = function(string $key, $value, ?string $class): bool
{
	return preg_match('#password#i', $key) && $value !== null;
};

// îl folosim pentru toate descărcările din BlueScreen
Tracy\Debugger::getBlueScreen()->scrubber = $scrubber;

Logger personalizat

Putem crea un logger personalizat pentru a înregistra erori, excepții neacoperite și, de asemenea, pentru a fi apelat de Tracy\Debugger::log(). Logger implementează interfața Tracy\ILogger.

use Tracy\ILogger;

class SlackLogger implements ILogger
{
	public function log($value, $priority = ILogger::INFO)
	{
		// trimite o cerere către Slack
	}
}

Și apoi îl activăm:

Tracy\Debugger::setLogger(new SlackLogger);

Dacă folosim Nette Framework complet, îl putem seta în fișierul de configurare NEON:

services:
	tracy.logger: SlackLogger

Monolog Integration

Pachetul Tracy oferă un adaptor PSR-3, care permite integrarea monolog/monolog.

$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'); // scrie: [<TIMESTAMP>] main-channel.INFO: info [] [] []
Debugger::log('warning', Debugger::WARNING); // scrie: [<TIMESTAMP>] main-channel.WARNING: warning [] [] []

nginx

Dacă Tracy nu funcționează pe nginx, probabil că este configurat greșit. Dacă există ceva de genul

try_files $uri $uri/ /index.php;

schimbați-l cu

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