1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Tracy\Bridges\Nette;
9:
10: use Nette;
11: use Tracy;
12:
13:
14: 15: 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: 'maxLength' => null,
30: 'maxDepth' => null,
31: 'showLocation' => null,
32: 'scream' => null,
33: 'bar' => [],
34: 'blueScreen' => [],
35: 'editorMapping' => [],
36: ];
37:
38:
39: private $debugMode;
40:
41:
42: private $cliMode;
43:
44:
45: public function __construct($debugMode = false, $cliMode = false)
46: {
47: $this->debugMode = $debugMode;
48: $this->cliMode = $cliMode;
49: }
50:
51:
52: public function loadConfiguration()
53: {
54: $this->validateConfig($this->defaults);
55: $builder = $this->getContainerBuilder();
56:
57: $builder->addDefinition($this->prefix('logger'))
58: ->setClass('Tracy\ILogger')
59: ->setFactory('Tracy\Debugger::getLogger');
60:
61: $builder->addDefinition($this->prefix('blueScreen'))
62: ->setFactory('Tracy\Debugger::getBlueScreen');
63:
64: $builder->addDefinition($this->prefix('bar'))
65: ->setFactory('Tracy\Debugger::getBar');
66: }
67:
68:
69: public function afterCompile(Nette\PhpGenerator\ClassType $class)
70: {
71: $initialize = $class->getMethod('initialize');
72: $builder = $this->getContainerBuilder();
73: $class = method_exists('Nette\DI\Helpers', 'filterArguments') ? 'Nette\DI\Helpers' : 'Nette\DI\Compiler';
74:
75: $options = $this->config;
76: unset($options['bar'], $options['blueScreen']);
77: if (isset($options['logSeverity'])) {
78: $res = 0;
79: foreach ((array) $options['logSeverity'] as $level) {
80: $res |= is_int($level) ? $level : constant($level);
81: }
82: $options['logSeverity'] = $res;
83: }
84: foreach ($options as $key => $value) {
85: if ($value !== null) {
86: $key = ($key === 'fromEmail' ? 'getLogger()->' : '$') . $key;
87: $initialize->addBody($builder->formatPhp(
88: 'Tracy\Debugger::' . $key . ' = ?;',
89: $class::filterArguments([$value])
90: ));
91: }
92: }
93:
94: $logger = $builder->getDefinition($this->prefix('logger'));
95: if ($logger->getFactory()->getEntity() !== 'Tracy\Debugger::getLogger') {
96: $initialize->addBody($builder->formatPhp('Tracy\Debugger::setLogger(?);', [$logger]));
97: }
98:
99: if ($this->debugMode) {
100: foreach ((array) $this->config['bar'] as $item) {
101: $initialize->addBody($builder->formatPhp(
102: '$this->getService(?)->addPanel(?);',
103: $class::filterArguments([
104: $this->prefix('bar'),
105: is_string($item) ? new Nette\DI\Statement($item) : $item,
106: ])
107: ));
108: }
109:
110: if (!$this->cliMode) {
111: $initialize->addBody('if ($tmp = $this->getByType("Nette\Http\Session", false)) { $tmp->start(); Tracy\Debugger::dispatch(); };');
112: }
113: }
114:
115: foreach ((array) $this->config['blueScreen'] as $item) {
116: $initialize->addBody($builder->formatPhp(
117: '$this->getService(?)->addPanel(?);',
118: $class::filterArguments([$this->prefix('blueScreen'), $item])
119: ));
120: }
121:
122: if (($dir = Tracy\Debugger::$logDirectory) && !is_writable($dir)) {
123: throw new Nette\InvalidStateException("Make directory '$dir' writable.");
124: }
125: }
126: }
127: