Passed
Push — master ( 692b12...afa4c1 )
by Guy
12:45 queued 13s
created

ControllerExtension::clearBuffer()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 6
nc 3
nop 0
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace LeKoala\DebugBar\Extension;
4
5
use LeKoala\DebugBar\DebugBar;
6
use SilverStripe\CMS\Controllers\ContentController;
7
use SilverStripe\Control\Controller;
8
use SilverStripe\Core\Extension;
9
use SilverStripe\Control\Controller;
0 ignored issues
show
Bug introduced by
A parse error occurred: Cannot use SilverStripe\Control\Controller as Controller because the name is already in use
Loading history...
10
use LeKoala\DebugBar\Collector\HeaderCollector;
11
use SilverStripe\CMS\Controllers\ContentController;
12
use LeKoala\DebugBar\Collector\SilverStripeCollector;
13
14
/**
15
 * A controller extension to log times and render the Debug Bar
16
 */
17
class ControllerExtension extends Extension
18
{
19
    public function onBeforeInit()
20
    {
21
        DebugBar::withDebugBar(function (\DebugBar\DebugBar $debugbar) {
22
            // We must set the current controller when it's available and before it's pushed out of stack
23
            /** @var \LeKoala\DebugBar\Collector\SilverStripeCollector $ssCollector */
24
            $ssCollector =  $debugbar->getCollector('silverstripe');
25
            $ssCollector->setController(Controller::curr());
26
27
            /** @var DebugBar\DataCollector\TimeDataCollector $timeData */
28
            $timeData = $debugbar->getCollector('time');
29
            if (!$timeData) {
30
                return;
31
            }
32
            if ($timeData->hasStartedMeasure('pre_request')) {
33
                $timeData->stopMeasure("pre_request");
34
            }
35
            $timeData->startMeasure("init", get_class($this->owner) . ' init');
36
        });
37
    }
38
39
    public function onAfterInit()
40
    {
41
        // Avoid requirements being called to early due to RootURLController
42
        if ($this->owner instanceof ContentController) {
43
            DebugBar::includeRequirements();
44
        }
45
46
        DebugBar::withDebugBar(function (\DebugBar\DebugBar $debugbar) {
47
            // Add the headers Collector
48
            if (!$debugbar->hasCollector('Headers') && DebugBar::config()->get('header_collector')) {
49
                $debugbar->addCollector(new HeaderCollector($this->owner));
50
            }
51
            /** @var DebugBar\DataCollector\TimeDataCollector $timeData */
52
            $timeData = $debugbar->getCollector('time');
53
            if (!$timeData) {
54
                return;
55
            }
56
            if ($timeData->hasStartedMeasure("cms_init")) {
57
                $timeData->stopMeasure("cms_init");
58
            }
59
            if ($timeData->hasStartedMeasure("init")) {
60
                $timeData->stopMeasure("init");
61
            }
62
            $timeData->startMeasure("handle", get_class($this->owner) . ' handle request');
63
        });
64
    }
65
66
    /**
67
     * @param HTTPRequest $request
68
     * @param string $action
69
     */
70
    public function beforeCallActionHandler($request, $action)
71
    {
72
        // If we don't have an action, getViewer will be called immediatly
73
        // If we have custom routes, request action is different than action
74
        $allParams     = $request->allParams();
75
        $requestAction = null;
76
        if (!empty($allParams['Action'])) {
77
            $requestAction = $allParams['Action'];
78
        }
79
        if (!$this->owner->hasMethod($action) || ($requestAction && $requestAction != $action)) {
80
            self::clearBuffer();
81
        }
82
83
        DebugBar::withDebugBar(function (\DebugBar\DebugBar $debugBar) use ($action) {
84
            /** @var DebugBar\DataCollector\TimeDataCollector $timeData */
85
            $timeData = $debugBar->getCollector('time');
86
            if (!$timeData) {
87
                return;
88
            }
89
            if ($timeData->hasStartedMeasure("handle")) {
90
                $timeData->stopMeasure("handle");
91
            }
92
            $timeData->startMeasure("action", get_class($this->owner) . " action $action");
93
        });
94
    }
95
96
    /**
97
     * @param HTTPRequest $request
98
     * @param string $action
99
     * @param mixed $result
100
     */
101
    public function afterCallActionHandler($request, $action, $result)
102
    {
103
        self::clearBuffer();
104
105
        DebugBar::withDebugBar(function (\DebugBar\DebugBar $debugBar) use ($action) {
106
            /** @var DebugBar\DataCollector\TimeDataCollector $timeData */
107
            $timeData = $debugBar->getCollector('time');
108
            if (!$timeData) {
109
                return;
110
            }
111
            if ($timeData->hasStartedMeasure("action")) {
112
                $timeData->stopMeasure("action");
113
            }
114
            $timeData->startMeasure(
115
                "after_action",
116
                get_class($this->owner) . " after action $action"
117
            );
118
        });
119
    }
120
121
    protected static function clearBuffer()
122
    {
123
        if (!DebugBar::$bufferingEnabled) {
124
            return;
125
        }
126
        $buffer = ob_get_clean();
127
        if (!empty($buffer)) {
128
            unset($_REQUEST['debug_request']); // Disable further messages that we can't intercept
129
            SilverStripeCollector::setDebugData($buffer);
130
        }
131
    }
132
}
133