Namespaces

  • Latte
    • Loaders
    • Macros
    • Runtime
  • Nette
    • Application
      • Responses
      • Routers
      • UI
    • Bridges
      • ApplicationDI
      • ApplicationLatte
      • ApplicationTracy
      • CacheDI
      • CacheLatte
      • DatabaseDI
      • DatabaseTracy
      • DITracy
      • FormsDI
      • FormsLatte
      • Framework
      • HttpDI
      • HttpTracy
      • MailDI
      • ReflectionDI
      • SecurityDI
      • SecurityTracy
    • Caching
      • Storages
    • ComponentModel
    • Database
      • Conventions
      • Drivers
      • Table
    • DI
      • Config
        • Adapters
      • Extensions
    • Forms
      • Controls
      • Rendering
    • Http
    • Iterators
    • Loaders
    • Localization
    • Mail
    • Neon
    • PhpGenerator
    • Reflection
    • Security
    • Tokenizer
    • Utils
  • Tracy
    • Bridges
      • Nette
  • none

Classes

  • TracyExtension
  • Overview
  • Namespace
  • Class
  • Tree
  • Deprecated
  1: <?php
  2: 
  3: /**
  4:  * This file is part of the Tracy (https://tracy.nette.org)
  5:  * Copyright (c) 2004 David Grudl (https://davidgrudl.com)
  6:  */
  7: 
  8: namespace Tracy\Bridges\Nette;
  9: 
 10: use Nette;
 11: use Tracy;
 12: 
 13: 
 14: /**
 15:  * Tracy extension for Nette DI.
 16:  */
 17: class TracyExtension extends Nette\DI\CompilerExtension
 18: {
 19:     public $defaults = [
 20:         'email' => null,
 21:         'fromEmail' => null,
 22:         'logSeverity' => null,
 23:         'editor' => null,
 24:         'browser' => null,
 25:         'errorTemplate' => null,
 26:         'strictMode' => null,
 27:         'showBar' => null,
 28:         'maxLen' => null,
 29:         'maxDepth' => null,
 30:         'showLocation' => null,
 31:         'scream' => null,
 32:         'bar' => [], // of class name
 33:         'blueScreen' => [], // of callback
 34:         'editorMapping' => [],
 35:     ];
 36: 
 37:     /** @var bool */
 38:     private $debugMode;
 39: 
 40:     /** @var bool */
 41:     private $cliMode;
 42: 
 43: 
 44:     public function __construct($debugMode = false, $cliMode = false)
 45:     {
 46:         $this->debugMode = $debugMode;
 47:         $this->cliMode = $cliMode;
 48:     }
 49: 
 50: 
 51:     public function loadConfiguration()
 52:     {
 53:         $this->validateConfig($this->defaults);
 54:         $builder = $this->getContainerBuilder();
 55: 
 56:         $builder->addDefinition($this->prefix('logger'))
 57:             ->setClass('Tracy\ILogger')
 58:             ->setFactory('Tracy\Debugger::getLogger');
 59: 
 60:         $builder->addDefinition($this->prefix('blueScreen'))
 61:             ->setFactory('Tracy\Debugger::getBlueScreen');
 62: 
 63:         $builder->addDefinition($this->prefix('bar'))
 64:             ->setFactory('Tracy\Debugger::getBar');
 65:     }
 66: 
 67: 
 68:     public function afterCompile(Nette\PhpGenerator\ClassType $class)
 69:     {
 70:         $initialize = $class->getMethod('initialize');
 71:         $builder = $this->getContainerBuilder();
 72:         $class = method_exists('Nette\DI\Helpers', 'filterArguments') ? 'Nette\DI\Helpers' : 'Nette\DI\Compiler';
 73: 
 74:         $options = $this->config;
 75:         unset($options['bar'], $options['blueScreen']);
 76:         if (isset($options['logSeverity'])) {
 77:             $res = 0;
 78:             foreach ((array) $options['logSeverity'] as $level) {
 79:                 $res |= is_int($level) ? $level : constant($level);
 80:             }
 81:             $options['logSeverity'] = $res;
 82:         }
 83:         foreach ($options as $key => $value) {
 84:             if ($value !== null) {
 85:                 $key = ($key === 'fromEmail' ? 'getLogger()->' : '$') . $key;
 86:                 $initialize->addBody($builder->formatPhp(
 87:                     'Tracy\Debugger::' . $key . ' = ?;',
 88:                     $class::filterArguments([$value])
 89:                 ));
 90:             }
 91:         }
 92: 
 93:         $logger = $builder->getDefinition($this->prefix('logger'));
 94:         if ($logger->getFactory()->getEntity() !== 'Tracy\Debugger::getLogger') {
 95:             $initialize->addBody($builder->formatPhp('Tracy\Debugger::setLogger(?);', [$logger]));
 96:         }
 97: 
 98:         if ($this->debugMode) {
 99:             foreach ((array) $this->config['bar'] as $item) {
100:                 $initialize->addBody($builder->formatPhp(
101:                     '$this->getService(?)->addPanel(?);',
102:                     $class::filterArguments([
103:                         $this->prefix('bar'),
104:                         is_string($item) ? new Nette\DI\Statement($item) : $item,
105:                     ])
106:                 ));
107:             }
108: 
109:             if (!$this->cliMode) {
110:                 $initialize->addBody('if ($tmp = $this->getByType("Nette\Http\Session", false)) { $tmp->start(); Tracy\Debugger::dispatch(); };');
111:             }
112:         }
113: 
114:         foreach ((array) $this->config['blueScreen'] as $item) {
115:             $initialize->addBody($builder->formatPhp(
116:                 '$this->getService(?)->addPanel(?);',
117:                 $class::filterArguments([$this->prefix('blueScreen'), $item])
118:             ));
119:         }
120: 
121:         if ($dir = Tracy\Debugger::$logDirectory) {
122:             $this->checkLogDirectory($dir);
123:         }
124:     }
125: 
126: 
127:     private function checkLogDirectory($dir)
128:     {
129:         $uniq = uniqid('_', true);
130:         if (!@mkdir("$dir/$uniq")) { // @ - is escalated to exception
131:             throw new Nette\InvalidStateException("Unable to write to directory '$dir'. Make this directory writable.");
132:         }
133:         rmdir("$dir/$uniq");
134:     }
135: }
136: 
Nette 2.4-20170829 API API documentation generated by ApiGen 2.8.0