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: 'maxDepth' => null,
30: 'showLocation' => null,
31: 'scream' => null,
32: 'bar' => [],
33: 'blueScreen' => [],
34: 'editorMapping' => [],
35: ];
36:
37:
38: private $debugMode;
39:
40:
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")) {
131: throw new Nette\InvalidStateException("Unable to write to directory '$dir'. Make this directory writable.");
132: }
133: rmdir("$dir/$uniq");
134: }
135: }
136: