GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

Trace::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Kotori.php
4
 *
5
 * A Tiny Model-View-Controller PHP Framework
6
 *
7
 * This content is released under the Apache 2 License
8
 *
9
 * Copyright (c) 2015-2017 Kotori Technology. All rights reserved.
10
 *
11
 * Licensed under the Apache License, Version 2.0 (the "License");
12
 * you may not use this file except in compliance with the License.
13
 * You may obtain a copy of the License at
14
 *
15
 *     http://www.apache.org/licenses/LICENSE-2.0
16
 *
17
 * Unless required by applicable law or agreed to in writing, software
18
 * distributed under the License is distributed on an "AS IS" BASIS,
19
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
 * See the License for the specific language governing permissions and
21
 * limitations under the License.
22
 */
23
24
/**
25
 * Trace Class
26
 *
27
 * @package     Kotori
28
 * @subpackage  Debug
29
 * @author      Kokororin
30
 * @link        https://kotori.love
31
 */
32
namespace Kotori\Debug;
33
34
use Kotori\Core\Container;
35
use Kotori\Core\Database;
36
use Kotori\Core\Handle;
37
use Kotori\Core\Helper;
38
use WyriHaximus\HtmlCompress\Factory as HtmlCompress;
39
40
class Trace
41
{
42
    /**
43
     * traceTab
44
     *
45
     * @var array
46
     */
47
    protected $traceTabs = [
48
        'BASE' => 'Basic',
49
        'CONFIG' => 'Config',
50
        'SERVER' => 'Server',
51
        'COOKIE' => 'Cookie',
52
        'FILE' => 'File',
53
        'FLOW' => 'Flow',
54
        'ERROR' => 'Error',
55
        'SQL' => 'SQL',
56
        'SUPPORT' => 'Support',
57
    ];
58
59
    /**
60
     * Class constructor
61
     *
62
     * Initialize Trace.
63
     */
64 1
    public function __construct()
65
    {
66 1
        Hook::listen(__CLASS__);
67 1
    }
68
69
    /**
70
     * Get Page Trace
71
     *
72
     * @return array
73
     */
74
    protected function getTrace()
0 ignored issues
show
Coding Style introduced by
getTrace uses the super-global variable $_SERVER which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
Coding Style introduced by
getTrace uses the super-global variable $_COOKIE which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
75
    {
76
        $files = get_included_files();
77
        $config = Container::get('config')->getArray();
78
        $server = $_SERVER;
79
        $cookie = $_COOKIE;
80
        $info = [];
81
        foreach ($files as $key => $file) {
82
            $info[] = $file . ' ( ' . number_format(filesize($file) / 1024, 2) . ' KB )';
83
        }
84
85
        $hook = Hook::getTags();
86
        foreach ($hook as $key => $value) {
87
            $hook[$key] = ' ( ' . $value . ' μs )';
88
        }
89
90
        $error = Handle::$errors;
91
92
        $sql = Database::$queries;
93
94
        $base = [
95
            'Request Info' => date('Y-m-d H:i:s', $_SERVER['REQUEST_TIME']) . ' ' . $_SERVER['SERVER_PROTOCOL'] . ' ' . $_SERVER['REQUEST_METHOD'] . ' : ' . $_SERVER['PHP_SELF'],
96
            'Run Time' => Hook::listen(\Kotori\App::class) . 'μs',
97
            'TPR' => Hook::listen(\Kotori\App::class) != 0 ? pow(10, 6) / Hook::listen(\Kotori\App::class) . ' req/s' : '+inf',
98
            'Memory Uses' => number_format((memory_get_usage() - KOTORI_START_MEMORY) / 1024, 2) . ' kb',
99
            'SQL Queries' => count($sql) . ' queries ',
100
            'File Loaded' => count(get_included_files()),
101
            'Session Info' => 'SESSION_ID=' . session_id(),
102
        ];
103
104
        $support = [
105
            '<a target="_blank" href="https://github.com/kokororin/Kotori.php">GitHub</a>',
106
            '<a target="_blank" href="https://kotori.love/archives/kotori-php-framework.html">Blog</a>',
107
        ];
108
109
        $trace = [];
110
        foreach ($this->traceTabs as $name => $title) {
111
            switch (strtoupper($name)) {
112
                case 'BASE':
113
                    $trace[$title] = $base;
114
                    break;
115
                case 'CONFIG':
116
                    $trace[$title] = $config;
117
                    break;
118
                case 'SERVER':
119
                    $trace[$title] = $server;
120
                    break;
121
                case 'COOKIE':
122
                    $trace[$title] = $cookie;
123
                    break;
124
                case 'FILE':
125
                    $trace[$title] = $info;
126
                    break;
127
                case 'FLOW':
128
                    $trace[$title] = $hook;
129
                    break;
130
                case 'ERROR':
131
                    $trace[$title] = $error;
132
                    break;
133
                case 'SQL':
134
                    $trace[$title] = $sql;
135
                    break;
136
                case 'SUPPORT':
137
                    $trace[$title] = $support;
138
                    break;
139
            }
140
        }
141
142
        return $trace;
143
    }
144
145
    /**
146
     * Show Page Trace in Output
147
     *
148
     * @return string
149
     */
150
    public function showTrace()
151
    {
152
        if (!Container::get('config')->get('app_debug')) {
153
            return;
154
        }
155
156
        $trace = $this->getTrace();
157
        $tpl = '
158
<!-- Kotori Page Trace (If you want to hide this feature, please set APP_DEBUG to false.)-->
159
<div id="page_trace" style="position: fixed; bottom: 0; right: 0; font-size: 14px; width: 100%; z-index: 999999; color: #000; text-align: left; font-family: \'Hiragino Sans GB\',\'Microsoft YaHei\',\'WenQuanYi Micro Hei\';">
160
<div id="page_trace_tab" style="display: none; background: white; margin: 0; height: 250px;">
161
<div id="page_trace_tab_tit" style="height: 30px; padding: 6px 12px 0; border-bottom: 1px solid #ececec; border-top: 1px solid #ececec; font-size: 16px">';
162
        foreach ($trace as $key => $value) {
163
            $tpl .= '<span id="page_trace_tab_tit_' . strtolower($key) . '" style="color: #000; padding-right: 12px; height: 30px; line-height: 30px; display: inline-block; margin-right: 3px; cursor: pointer; font-weight: 700">' . $key . '</span>';
164
        }
165
166
        $tpl .= '</div>
167
<div id="page_trace_tab_cont" style="overflow: auto; height: 212px; padding: 0; line-height: 24px">';
168
        foreach ($trace as $key => $info) {
169
            $tpl .= '<div id="page_trace_tab_cont_' . strtolower($key) . '" style="display: none;">
170
    <ol style="padding: 0; margin: 0">';
171
            if (is_array($info)) {
172
                foreach ($info as $k => $val) {
173
                    $val = is_array($val) ? print_r($val, true) : (is_bool($val) ? json_encode($val) : $val);
174
                    $val = (in_array($key, ['Support'])) ? $val : htmlentities($val, ENT_COMPAT, 'utf-8');
175
                    $tpl .= '<li style="border-bottom: 1px solid #EEE; font-size: 14px; padding: 0 12px">' . (is_numeric($k) ? '' : $k . ' : ') . $val . '</li>';
176
                }
177
            }
178
179
            $tpl .= '</ol>
180
    </div>';
181
        }
182
183
        $tpl .= '</div>
184
</div>
185
<div id="page_trace_close" style="display: none; text-align: right; height: 15px; position: absolute; top: 10px; right: 12px; cursor: pointer;"><img style="vertical-align: top;" src="data:image/gif;base64,R0lGODlhDwAPAJEAAAAAAAMDA////wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MUQxMjc1MUJCQUJDMTFFMTk0OUVGRjc3QzU4RURFNkEiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MUQxMjc1MUNCQUJDMTFFMTk0OUVGRjc3QzU4RURFNkEiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDoxRDEyNzUxOUJBQkMxMUUxOTQ5RUZGNzdDNThFREU2QSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDoxRDEyNzUxQUJBQkMxMUUxOTQ5RUZGNzdDNThFREU2QSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAAAAAAALAAAAAAPAA8AAAIdjI6JZqotoJPR1fnsgRR3C2jZl3Ai9aWZZooV+RQAOw==" /></div>
186
</div>
187
<div id="page_trace_open" style="height: 30px; float: right; text-align: right; overflow: hidden; position: fixed; bottom: 0; right: 0; color: #000; line-height: 30px; cursor: pointer;"><div style="background: #232323; color: #FFF; padding: 0 6px; float: right; line-height: 30px; font-size:14px">';
188
        $errorCount = count(Handle::$errors);
189
190
        if ($errorCount == 0) {
191
            $tpl .= Hook::listen(\Kotori\App::class) . 'μs';
192
        } else {
193
            $tpl .= $errorCount . ' errors';
194
        }
195
196
        $tpl .= '</div><img width="30" style="border-left:2px solid black;border-top:2px solid black;border-bottom:2px solid black;" title="ShowPageTrace" src="' . Helper::logo() . '"></div>';
197
        $tpl .= HtmlCompress::construct()->compress('<script type="text/javascript">
198
(function() {
199
\'use strict\';
200
var tab_tit = document.getElementById(\'page_trace_tab_tit\').getElementsByTagName(\'span\'),
201
    tab_cont = document.getElementById(\'page_trace_tab_cont\').getElementsByTagName(\'div\'),
202
    open = document.getElementById(\'page_trace_open\'),
203
    close = document.getElementById(\'page_trace_close\').children[0],
204
    trace = document.getElementById(\'page_trace_tab\'),
205
    storage = localStorage.getItem(\'kotori_show_page_trace\'),
206
    history = (storage !== null && storage.split(\'|\')) ||  [0,0],
207
    bindClick = function(dom, listener) {
208
        if (dom.addEventListener) {
209
            dom.addEventListener(\'click\', listener, false);
210
        } else {
211
            dom.attachEvent(\'onclick\', listener);
212
        }
213
    };
214
bindClick(open, function() {
215
    trace.style.display = \'block\';
216
    this.style.display = \'none\';
217
    close.parentNode.style.display = \'block\';
218
    history[0] = 1;
219
    localStorage.setItem(\'kotori_show_page_trace\', history.join(\'|\'));
220
});
221
bindClick(close, function() {
222
    trace.style.display = \'none\';
223
    this.parentNode.style.display = \'none\';
224
    open.style.display = \'block\';
225
    history[0] = 0;
226
    localStorage.setItem(\'kotori_show_page_trace\', history.join(\'|\'));
227
});
228
for (var i = 0; i < tab_tit.length; i++) {
229
    bindClick(tab_tit[i], (function(i) {
230
        return function() {
231
            for (var j = 0; j < tab_cont.length; j++) {
232
                tab_cont[j].style.display = \'none\';
233
                tab_tit[j].style.color = \'#999\';
234
            }
235
            tab_cont[i].style.display = \'block\';
236
            tab_tit[i].style.color = \'#000\';
237
            history[1] = i;
238
            localStorage.setItem(\'kotori_show_page_trace\', history.join(\'|\'));
239
        };
240
    })(i));
241
}
242
parseInt(history[0]) && open.click();
243
tab_tit[history[1]].click();
244
})();
245
</script>');
246
        return $tpl;
247
    }
248
}
249