DebugBar.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. namespace KarmaFW\App\Middlewares;
  3. use \DebugBar\StandardDebugBar;
  4. //use \DebugBar\DataCollector\MessagesCollector;
  5. use \DebugBar\DataCollector\ConfigCollector;
  6. use \KarmaFW\App;
  7. use \KarmaFW\Http\Request;
  8. use \KarmaFW\Http\Response;
  9. use \KarmaFW\App\Middlewares\DebugBar\KarmaFwCollector;
  10. use \KarmaFW\App\Middlewares\DebugBar\SEOCollector;
  11. use \KarmaFW\App\Middlewares\DebugBar\SqlDbCollector;
  12. use \KarmaFW\App\Middlewares\DebugBar\SqlDbTimelineCollector;
  13. use \KarmaFW\App\Middlewares\DebugBar\KarmaMessagesCollector;
  14. //use \KarmaFW\App\Middlewares\DebugBar\PhpTemplateCollector;
  15. class DebugBar
  16. {
  17. public function __invoke(Request $request, Response $response, callable $next)
  18. {
  19. $load_debugbar = ( class_exists('\\DebugBar\\StandardDebugBar') && ((defined('ENV') && ENV == 'dev') || defined('FORCE_DEBUGBAR') && FORCE_DEBUGBAR) );
  20. $load_debugbar = $load_debugbar && $request->isGet() && ! $request->isAjax() && (! isset($_GET['debugbar']) || ! empty($_GET['debugbar']));
  21. if ($load_debugbar) {
  22. $debugbar = new StandardDebugBar();
  23. App::setData('debugbar', $debugbar);
  24. $debugbar->addCollector(new ConfigCollector);
  25. $debugbar->addCollector(new KarmaFwCollector);
  26. $debugbar->addCollector(new SqlDbCollector);
  27. $debugbar->addCollector(new SqlDbTimelineCollector);
  28. $debugbar->addCollector(new KarmaMessagesCollector('templates'));
  29. $debugbar->addCollector(new ConfigCollector([], 'templates_vars'));
  30. $debugbar->addCollector(new SEOCollector);
  31. $debugbarRenderer = $debugbar->getJavascriptRenderer('/assets/vendor/debugbar'); // symlink to ${APP_DIR}/vendor/maximebf/debugbar/src/DebugBar/Resources
  32. }
  33. $response = $next($request, $response);
  34. $is_html = (empty($response->getContentType()) || strpos($response->getContentType(), 'text/html') === 0);
  35. $show_debugbar = ($load_debugbar && $is_html && $response->getStatus() == 200);
  36. if ($show_debugbar) {
  37. // config
  38. $constants = get_defined_constants(true);
  39. $debugbar['config']->setData($constants['user']);
  40. // KarmaFW
  41. if (isset($debugbar['KarmaFW'])) {
  42. $data = [
  43. 'app' => App::getData('app'),
  44. 'request' => $request,
  45. 'response' => $response,
  46. ];
  47. $debugbar['KarmaFW']->setData($data);
  48. }
  49. // SEO
  50. if (isset($debugbar['SEO'])) {
  51. $seo_data = $this->seoParseContent($response);
  52. $debugbar['SEO']->setData($seo_data);
  53. }
  54. $response->append( $debugbarRenderer->renderHead() );
  55. // TODO: $response->injectAppendTo('head', $debugbarRenderer->renderHead())
  56. // => function injectAppendTo($tag) { $body = preg_replace('|</'.$tag.'>|', $injected_html . '</'.$tag.'>', $body, 1);
  57. $response->append( $debugbarRenderer->render() );
  58. // TODO: injectAppendTo('body', $debugbarRenderer->render())
  59. $response->addHeader('X-DebugBar', 'on');
  60. } else {
  61. $response->addHeader('X-DebugBar', 'off');
  62. }
  63. return $response;
  64. }
  65. protected function seoParseContent(Response $response)
  66. {
  67. $content = $response->getBody();
  68. preg_match('~<title(.*?)>(.*?)</title>~is', $content, $matches);
  69. $title = empty($matches) ? '' : $matches[2];
  70. preg_match('~<meta +name="description" +content="(.*?)" *>~is', $content, $matches);
  71. $meta_desc = empty($matches) ? '' : $matches[1];
  72. preg_match('~<h1(.*?)>(.*?)</h1>~is', $content, $matches);
  73. $h1 = empty($matches) ? '' : $matches[2];
  74. preg_match_all('/<a /is', $content, $matches);
  75. $nb_links = empty($matches) ? 0 : count($matches[0]);
  76. $data = [
  77. 'title' => $title,
  78. 'meta description' => $meta_desc,
  79. 'h1' => $h1,
  80. 'nb links' => $nb_links,
  81. 'content length' => formatSize(strlen($content)),
  82. ];
  83. return $data;
  84. }
  85. }