%PDF- %PDF-
| Direktori : /www/varak.net/losik.varak.net/vendor/tracy/tracy/src/Bridges/Nette/ |
| Current File : /www/varak.net/losik.varak.net/vendor/tracy/tracy/src/Bridges/Nette/TracyExtension.php |
<?php
/**
* This file is part of the Tracy (https://tracy.nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare(strict_types=1);
namespace Tracy\Bridges\Nette;
use Nette;
use Nette\DI\Definitions\Statement;
use Nette\Schema\Expect;
use Tracy;
/**
* Tracy extension for Nette DI.
*/
class TracyExtension extends Nette\DI\CompilerExtension
{
private const ErrorSeverityPattern = 'E_(?:ALL|PARSE|STRICT|RECOVERABLE_ERROR|(?:CORE|COMPILE)_(?:ERROR|WARNING)|(?:USER_)?(?:ERROR|WARNING|NOTICE|DEPRECATED))';
/** @var bool */
private $debugMode;
/** @var bool */
private $cliMode;
public function __construct(bool $debugMode = false, bool $cliMode = false)
{
$this->debugMode = $debugMode;
$this->cliMode = $cliMode;
}
public function getConfigSchema(): Nette\Schema\Schema
{
$errorSeverity = Expect::string()->pattern(self::ErrorSeverityPattern);
$errorSeverityExpr = Expect::string()->pattern('(' . self::ErrorSeverityPattern . '|[ &|~()])+');
return Expect::structure([
'email' => Expect::anyOf(Expect::email(), Expect::listOf('email'))->dynamic(),
'fromEmail' => Expect::email()->dynamic(),
'emailSnooze' => Expect::string()->dynamic(),
'logSeverity' => Expect::anyOf(Expect::int(), $errorSeverityExpr, Expect::listOf($errorSeverity)),
'editor' => Expect::type('string|null')->dynamic(),
'browser' => Expect::string()->dynamic(),
'errorTemplate' => Expect::string()->dynamic(),
'strictMode' => Expect::anyOf(Expect::bool(), Expect::int(), $errorSeverityExpr, Expect::listOf($errorSeverity)),
'showBar' => Expect::bool()->dynamic(),
'maxLength' => Expect::int()->dynamic(),
'maxDepth' => Expect::int()->dynamic(),
'maxItems' => Expect::int()->dynamic(),
'keysToHide' => Expect::array(null)->dynamic(),
'dumpTheme' => Expect::string()->dynamic(),
'showLocation' => Expect::bool()->dynamic(),
'scream' => Expect::anyOf(Expect::bool(), Expect::int(), $errorSeverityExpr, Expect::listOf($errorSeverity)),
'bar' => Expect::listOf('string|Nette\DI\Definitions\Statement'),
'blueScreen' => Expect::listOf('callable'),
'editorMapping' => Expect::arrayOf('string')->dynamic()->default(null),
'netteMailer' => Expect::bool(true),
]);
}
public function loadConfiguration()
{
$builder = $this->getContainerBuilder();
$builder->addDefinition($this->prefix('logger'))
->setClass(Tracy\ILogger::class)
->setFactory([Tracy\Debugger::class, 'getLogger']);
$builder->addDefinition($this->prefix('blueScreen'))
->setFactory([Tracy\Debugger::class, 'getBlueScreen']);
$builder->addDefinition($this->prefix('bar'))
->setFactory([Tracy\Debugger::class, 'getBar']);
}
public function afterCompile(Nette\PhpGenerator\ClassType $class)
{
$initialize = $this->initialization ?? new Nette\PhpGenerator\Closure;
$initialize->addBody('if (!Tracy\Debugger::isEnabled()) { return; }');
$builder = $this->getContainerBuilder();
$logger = $builder->getDefinition($this->prefix('logger'));
$initialize->addBody($builder->formatPhp('$logger = ?;', [$logger]));
if (
!$logger instanceof Nette\DI\Definitions\ServiceDefinition
|| $logger->getFactory()->getEntity() !== [Tracy\Debugger::class, 'getLogger']
) {
$initialize->addBody('Tracy\Debugger::setLogger($logger);');
}
$options = (array) $this->config;
unset($options['bar'], $options['blueScreen'], $options['netteMailer']);
foreach (['logSeverity', 'strictMode', 'scream'] as $key) {
if (is_string($options[$key]) || is_array($options[$key])) {
$options[$key] = $this->parseErrorSeverity($options[$key]);
}
}
foreach ($options as $key => $value) {
if ($value !== null) {
$tbl = [
'keysToHide' => 'array_push(Tracy\Debugger::getBlueScreen()->keysToHide, ... ?)',
'fromEmail' => 'if ($logger instanceof Tracy\Logger) $logger->fromEmail = ?',
'emailSnooze' => 'if ($logger instanceof Tracy\Logger) $logger->emailSnooze = ?',
];
$initialize->addBody($builder->formatPhp(
($tbl[$key] ?? 'Tracy\Debugger::$' . $key . ' = ?') . ';',
Nette\DI\Helpers::filterArguments([$value])
));
}
}
if ($this->config->netteMailer && $builder->getByType(Nette\Mail\IMailer::class)) {
$initialize->addBody($builder->formatPhp('if ($logger instanceof Tracy\Logger) $logger->mailer = ?;', [
[new Statement(Tracy\Bridges\Nette\MailSender::class, ['fromEmail' => $this->config->fromEmail]), 'send'],
]));
}
if ($this->debugMode) {
foreach ($this->config->bar as $item) {
if (is_string($item) && substr($item, 0, 1) === '@') {
$item = new Statement(['@' . $builder::THIS_CONTAINER, 'getService'], [substr($item, 1)]);
} elseif (is_string($item)) {
$item = new Statement($item);
}
$initialize->addBody($builder->formatPhp(
'$this->getService(?)->addPanel(?);',
Nette\DI\Helpers::filterArguments([$this->prefix('bar'), $item])
));
}
if (
!$this->cliMode
&& Tracy\Debugger::getSessionStorage() instanceof Tracy\NativeSession
&& ($name = $builder->getByType(Nette\Http\Session::class))
) {
$initialize->addBody('$this->getService(?)->start();', [$name]);
$initialize->addBody('Tracy\Debugger::dispatch();');
}
}
foreach ($this->config->blueScreen as $item) {
$initialize->addBody($builder->formatPhp(
'$this->getService(?)->addPanel(?);',
Nette\DI\Helpers::filterArguments([$this->prefix('blueScreen'), $item])
));
}
if (empty($this->initialization)) {
$class->getMethod('initialize')->addBody("($initialize)();");
}
if (($dir = Tracy\Debugger::$logDirectory) && !is_writable($dir)) {
throw new Nette\InvalidStateException("Make directory '$dir' writable.");
}
}
/**
* @param string|string[] $value
*/
private function parseErrorSeverity($value): int
{
$value = implode('|', (array) $value);
$res = (int) @parse_ini_string('e = ' . $value)['e']; // @ may fail
if (!$res) {
throw new Nette\InvalidStateException("Syntax error in expression '$value'");
}
return $res;
}
}