DebugBar.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 KarmaFwCollector);
  25. $debugbar->addCollector(new ConfigCollector);
  26. $debugbar->addCollector(new SqlDbCollector);
  27. $debugbar->addCollector(new SqlDbTimelineCollector);
  28. $debugbar->addCollector(new KarmaMessagesCollector('templates'));
  29. $debugbar->addCollector(new SEOCollector);
  30. $debugbarRenderer = $debugbar->getJavascriptRenderer('/assets/vendor/debugbar'); // symlink to ${APP_DIR}/vendor/maximebf/debugbar/src/DebugBar/Resources
  31. }
  32. $response = $next($request, $response);
  33. $is_html = (empty($response->getContentType()) || strpos($response->getContentType(), 'text/html') === 0);
  34. $show_debugbar = ($load_debugbar && $is_html && $response->getStatus() == 200);
  35. if ($show_debugbar) {
  36. // config
  37. $constants = get_defined_constants(true);
  38. $debugbar['config']->setData($constants['user']);
  39. // KarmaFW
  40. if (isset($debugbar['KarmaFW'])) {
  41. $data = [
  42. 'app' => App::getData('app'),
  43. 'request' => $request,
  44. 'response' => $response,
  45. ];
  46. $debugbar['KarmaFW']->setData($data);
  47. }
  48. // SEO
  49. if (isset($debugbar['SEO'])) {
  50. $seo_data = $this->seoParseContent($response);
  51. $debugbar['SEO']->setData($seo_data);
  52. }
  53. $response->append( $debugbarRenderer->renderHead() );
  54. // TODO: $response->injectAppendTo('head', $debugbarRenderer->renderHead())
  55. // => function injectAppendTo($tag) { $body = preg_replace('|</'.$tag.'>|', $injected_html . '</'.$tag.'>', $body, 1);
  56. $response->append( $debugbarRenderer->render() );
  57. // TODO: injectAppendTo('body', $debugbarRenderer->render())
  58. $response->addHeader('X-DebugBar', 'on');
  59. } else {
  60. $response->addHeader('X-DebugBar', 'off');
  61. }
  62. return $response;
  63. }
  64. protected function seoParseContent(Response $response)
  65. {
  66. $content = $response->getBody();
  67. preg_match('~<title(.*?)>(.*?)</title>~is', $content, $matches);
  68. $title = empty($matches) ? '' : $matches[2];
  69. preg_match('~<meta +name="description" +content="(.*?)" *>~is', $content, $matches);
  70. $meta_desc = empty($matches) ? '' : $matches[1];
  71. preg_match('~<h1(.*?)>(.*?)</h1>~is', $content, $matches);
  72. $h1 = empty($matches) ? '' : $matches[2];
  73. preg_match_all('/<a /is', $content, $matches);
  74. $nb_links = empty($matches) ? 0 : count($matches[0]);
  75. $data = [
  76. 'title' => $title,
  77. 'meta description' => $meta_desc,
  78. 'h1' => $h1,
  79. 'nb links' => $nb_links,
  80. 'content length' => formatSize(strlen($content)),
  81. ];
  82. return $data;
  83. }
  84. }