static function startUp(KernelInterface $kernel, ModuleInfo $moduleInfo) { $kernel->onConfigure(function (LoggerInterface $logger, $webConsole) { if ($webConsole) { DebugConsole::registerPanel('request', new PSR7RequestLogger('Request', 'fa fa-paper-plane')); DebugConsole::registerPanel('response', new PSR7ResponseLogger('Response', 'fa fa-file')); DebugConsole::registerPanel('routes', new ConsoleLogger('Routing', 'fa fa-location-arrow')); DebugConsole::registerPanel('navigation', new ConsoleLogger('Navigation', 'fa fa-compass big')); DebugConsole::registerPanel('config', new ConsoleLogger('Configuration', 'fa fa-cogs')); DebugConsole::registerPanel('session', new ConsoleLogger('Session', 'fa fa-user')); DebugConsole::registerPanel('database', new ConsoleLogger('Database', 'fa fa-database')); DebugConsole::registerLogger('trace', new ConsoleLogger('Trace', 'fa fa-clock-o big')); // DebugConsole::registerPanel ('exceptions', new ConsoleLogger ('Exceptions', 'fa fa-bug')); // Writing to the logger also writes to the Inspector panel. if ($logger instanceof Logger) { $logger->pushHandler(new WebConsoleMonologHandler(env('DEBUG_LEVEL') ?: Logger::DEBUG)); } } }); }
function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next) { if (!$this->webConsole) { // In case the middleware was registered. return $next(); } //------------------------------------------------------------------ /** @var ResponseInterface $response */ $response = $next(); $contentType = $response->getHeaderLine('Content-Type'); $status = $response->getStatusCode(); if ($status >= 300 && $status < 400 || $contentType && $contentType != 'text/html') { return $response; } $response->getBody()->rewind(); //------------------ // Logging panel //------------------ if (extension_loaded('xdebug')) { DebugConsole::defaultLogger()->write('<#alert><b>Warning:</b> When running with Xdebug enabled, the framework\'s performance is severely degraded, especially on debug mode.</#alert>' . '<p class=__comment>Refer to the framework\'s documentation for more information.</p>'); } //------------------ // Request panel //------------------ $log = DebugConsole::logger('request'); if (!$log->hasRequest()) { $log->setRequest($request); } //------------------ // Response panel //------------------ DebugConsole::logger('response')->setResponse($response); //------------------ // Routing panel //------------------ $router = $this->injector->make(ApplicationRouterInterface::class); $handlers = $router->__debugInfo()['handlers']; $rootR = $handlers ? implode('', map($handlers, function ($r) { return sprintf('<#row><#type>%s</#type></#row>', is_string($r) ? $r : typeOf($r)); })) : '<#i><i>empty</i></#i>'; $logger = $this->injector->make(RoutingLogger::class); $log = $logger->getContent(); DebugConsole::logger('routes')->write("<#section|REGISTERED ROUTERS>{$rootR}</#section>" . "<#section|APPLICATION MIDDLEWARE STACK ┊ RUN HISTORY>")->write($log)->write("<#row>Return from ")->typeName($this)->write("</#row>")->write("<#row><i>(log entries from this point on can't be displayed)</i></#row>")->write("</#indent>")->write("<#row>Exit stack 1</#row>")->write("<#row>End of routing log</#row>")->write("</#section>"); //------------------ // Navigation panel //------------------ if ($this->injector->provides(NavigationInterface::class)) { try { /** @var NavigationInterface $navigation */ $navigation = $this->injector->make(NavigationInterface::class); DebugConsole::logger('navigation')->withFilter(function ($k, $v, $o) use($navigation) { if ($k === 'parent' || $k === 'request') { return '...'; } if ($k === 'IDs' && $o != $navigation->rootLink()) { return '...'; } return true; }, $navigation); } catch (\Exception $e) { } } //------------------ // Config. panel //------------------ DebugConsole::logger('config')->inspect($this->kernelSettings); //------------------ // Session panel //------------------ if ($this->injector->provides(SessionInterface::class)) { DebugConsole::logger('session')->write('<button type="button" class="__btn __btn-default" style="position:absolute;right:5px;top:5px" onclick="location.href=\'logout\'">Log out</button>')->inspect($this->injector->make(SessionInterface::class)); } //------------------ // Tracing panel //------------------ $trace = DebugConsole::logger('trace'); if ($trace->hasContent()) { DebugConsole::registerPanel('trace', $trace); } return DebugConsole::outputContentViaResponse($request, $response, true); }
protected function afterRender() { parent::afterRender(); //---------------------------------------------------------------------------------------- // View Model panel // (MUST run before the DOM panel to capture the data-binding stack at its current state) //---------------------------------------------------------------------------------------- DebugConsole::registerPanel('view', new ConsoleLogger('View', 'fa fa-eye')); $VMFilter = function ($k, $v, $o) { if ($v instanceof DocumentContext || $v instanceof Component || $k === 'parent' || $k === 'model') { return '...'; } return true; }; $expMap = Expression::$inspectionMap; ksort($expMap); DebugConsole::logger('view')->withFilter($VMFilter, $this->context)->write('<#section|Compiled expressions>')->inspect($expMap)->write('</#section>'); //------------ // Model panel //------------ DebugConsole::registerPanel('model', new ConsoleLogger('Model', 'fa fa-table')); $shadowDOM = $this->getShadowDOM(); if ($shadowDOM) { $VMFilter = function ($k, $v, $o) { if ($v instanceof KernelSettings || $v instanceof NavigationInterface || $v instanceof NavigationLinkInterface || $v instanceof SessionInterface || $v instanceof ServerRequestInterface || $v instanceof DocumentContext || $v instanceof Component) { return '...'; } return true; }; $binder = $shadowDOM->getDataBinder(); DebugConsole::logger('model')->write('<#i>PAGE DATA BINDER: ' . Debug::getType($binder) . "</#i>")->write("<#section|PAGE VIEW MODEL>")->withFilter($VMFilter, $binder->getViewModel())->write("</#section>"); } //----------- // DOM panel //----------- if ($this->matisseSettings->inspectDOM()) { DebugConsole::registerPanel('DOM', new ConsoleLogger('Server-side DOM', 'fa fa-sitemap')); $insp = $this->inspect(true); DebugConsole::logger('DOM')->write($insp); } }