Max F 5 år sedan
förälder
incheckning
64e5a4112b

+ 31 - 6
src/App/Middlewares/DebugBar.php

@@ -2,26 +2,51 @@
 
 namespace KarmaFW\App\Middlewares;
 
+use \DebugBar\StandardDebugBar;
+//use \DebugBar\DataCollector\MessagesCollector;
+use \DebugBar\DataCollector\TimeDataCollector;
+
+use \KarmaFW\App;
 use \KarmaFW\Http\Request;
 use \KarmaFW\Http\Response;
+use \KarmaFW\Database\Sql\SqlDbCollector;
+use \KarmaFW\Lib\KarmaMessagesCollector;
+//use \KarmaFW\Templates\PhpTemplateCollector;
 
-use \DebugBar\StandardDebugBar;
 
 class DebugBar
 {
 	
 	public function __invoke(Request $request, Response $response, callable $next)
 	{
-		$debugbar = new StandardDebugBar();
-		//$debugbar->addCollector(new MessagesCollector('sql'));
+		$load_debugbar = (defined('ENV') && ENV == 'dev');
+
+		if ($load_debugbar) {
+			$debugbar = new StandardDebugBar();
+			App::setData('debugbar', $debugbar);
+			
+			$debugbar->addCollector(new SqlDbCollector);
+
+			//$debugbar->addCollector(new PhpTemplateCollector); // DO NOT WORK
+			$debugbar->addCollector(new KarmaMessagesCollector('templates'));
+
+			$debugbarRenderer = $debugbar->getJavascriptRenderer('/assets/vendor/debugbar'); // symlink to ${APP_DIR}/vendor/maximebf/debugbar/src/DebugBar/Resources
+		}
 
-		$debugbarRenderer = $debugbar->getJavascriptRenderer('/assets/vendor/debugbar'); // symlink to ${APP_DIR}/vendor/maximebf/debugbar/src/DebugBar/Resources
 
 		$response = $next($request, $response);
 
+		$is_html = (empty($response->getContentType()) || strpos($response->getContentType(), 'text/html') === 0);
+		$show_debugbar = ($load_debugbar && $is_html);
+
+		if ($show_debugbar) {
+			$response->append( $debugbarRenderer->renderHead() );
+			// TODO: $response->injectAppendTo('head', $debugbarRenderer->renderHead())
+			// => function injectAppendTo($tag) { $body = preg_replace('|</'.$tag.'>|', $injected_html . '</'.$tag.'>', $body, 1);
 
-		$response->append( $debugbarRenderer->renderHead() );
-		$response->append( $debugbarRenderer->render() );
+			$response->append( $debugbarRenderer->render() );
+			// TODO: injectAppendTo('body', $debugbarRenderer->render())
+		}
 
 
 		return $response;

+ 11 - 0
src/App/Middlewares/ErrorHandler.php

@@ -2,6 +2,7 @@
 
 namespace KarmaFW\App\Middlewares;
 
+use \KarmaFW\App;
 use \KarmaFW\Http\Request;
 use \KarmaFW\Http\Response;
 
@@ -37,6 +38,16 @@ class ErrorHandler
             $error_code = $e->getCode();
             $error_message = $e->getMessage();
 
+
+            // TODO: voir comment bien injecter cette dependance
+            $debugbar = App::getData('debugbar');
+            if ($debugbar) {
+                if (isset($debugbar['exceptions'])) {
+                    $debugbar['exceptions']->addException($e);
+                }
+            }
+
+
             /*
             if ($error_code == 404) {
                 // case moved to UrlRouter

+ 10 - 0
src/App/Middlewares/UrlRouter.php

@@ -2,6 +2,7 @@
 
 namespace KarmaFW\App\Middlewares;
 
+use \KarmaFW\App;
 use \KarmaFW\Http\Request;
 use \KarmaFW\Http\Response;
 use \KarmaFW\Routing\Router;
@@ -55,6 +56,15 @@ class UrlRouter
 			$error_message = $e->getMessage();
 
 
+			// TODO: voir comment bien injecter cette dependance
+			$debugbar = App::getData('debugbar');
+			if ($debugbar) {
+	            if (isset($debugbar['exceptions'])) {
+					$debugbar['exceptions']->addException($e);
+	            }
+	        }
+
+
 			// REDIRECTION
 			if (in_array($error_code, [301, 302, 310])) {
 				// if $error_code is a redirection

+ 18 - 0
src/App/Pipe.php

@@ -2,6 +2,7 @@
 
 namespace KarmaFW\App;
 
+use \KarmaFW\App;
 use \KarmaFW\Http\Request;
 use \KarmaFW\Http\Response;
 
@@ -34,7 +35,24 @@ class Pipe
         }
 
         $service = array_shift($this->services);
+        $service_name = get_class($service);
+
+        $debugbar = App::getData('debugbar');
+        if ($debugbar) {
+            if (isset($debugbar['time'])) {
+                $debugbar['time']->startMeasure($service_name, $service_name);
+            }
+        }
+
         $response = call_user_func($service, $request, $response, [$this, 'next']);
+
+        $debugbar = App::getData('debugbar');
+        if ($debugbar) {
+            if (isset($debugbar['time']) && $debugbar['time']->hasStartedMeasure($service_name)) {
+                $debugbar['time']->stopMeasure($service_name);
+            }
+        }
+
         return $response;
     }
 }

+ 70 - 0
src/Database/Sql/SqlDbCollector.php

@@ -0,0 +1,70 @@
+<?php
+
+namespace KarmaFW\Database\Sql;
+
+use \DebugBar\DataCollector\DataCollector;
+use \DebugBar\DataCollector\Renderable;
+use \DebugBar\DataCollector\AssetProvider;
+
+
+/* USE THIS WITH DEBUGBAR (see http://phpdebugbar.com/ or https://github.com/maximebf/php-debugbar ) */
+
+class SqlDbCollector extends DataCollector implements Renderable, AssetProvider
+{
+	protected $sql_queries = [];
+	protected $totalExecTime = 0;
+
+
+    public function collect()
+    {
+	    return [
+	        'nb_statements' => count($this->sql_queries),
+	        'accumulated_duration' => $this->totalExecTime,
+	        'accumulated_duration_str' => round($this->totalExecTime, 5),
+	        'statements' => $this->sql_queries,
+	    ];
+    }
+
+    public function getName()
+    {
+        return 'sql_queries';
+    }
+
+
+    public function addQuery($query)
+    {
+    	$this->sql_queries[] = $query;
+    	$this->totalExecTime += $query['duration'];
+    }
+
+
+    public function getWidgets()
+    {
+        return [
+            "sql" => [
+                "icon" => "inbox",
+                "tooltip" => "SQL Queries",
+                //"widget" => "PhpDebugBar.Widget",
+                "widget" => "PhpDebugBar.Widgets.SQLQueriesWidget",
+                //"widget" => "PhpDebugBar.Widgets.MessagesWidget",
+                "map" => "sql_queries",
+                "default" => "[]"
+            ],
+            "sql:badge" => [
+                "map" => "sql_queries.nb_statements",
+                "default" => 0
+            ],
+        ];
+    }
+
+
+    public function getAssets()
+    {
+        return array(
+            'css' => 'widgets/sqlqueries/widget.css',
+            'js' => 'widgets/sqlqueries/widget.js'
+        );
+    }
+
+}
+

+ 19 - 0
src/Database/Sql/SqlQuery.php

@@ -2,6 +2,7 @@
 
 namespace KarmaFW\Database\Sql;
 
+use \KarmaFW\App;
 use \KarmaFW\Database\Sql\SqlResultSetError;
 
 
@@ -138,6 +139,24 @@ class SqlQuery
 		$this->recordset = $rs;
 		$this->db->setLastQuery($this);
 
+
+		// TODO: voir comment bien injecter cette dependance
+		$debugbar = App::getData('debugbar');
+		if ($debugbar) {
+			//$debugbar['sql']->addMessage( preg_replace('/\s+/', ' ', $query) );
+			
+			if (isset($debugbar['sql_queries'])) {
+				$debugbar['sql_queries']->addQuery([
+					'sql' => preg_replace('/\s+/', ' ', $query),
+					'duration' => $this->duration,
+					//'nb_rows' => 'n/a',
+					'duration_str' => round($this->duration, 5),
+				]);
+			}
+			
+		}
+
+
 		if ($rs instanceOf SqlResultSetError) {
 			// query error
 			$error_code = $rs->getErrorCode();

+ 11 - 0
src/Kernel.php

@@ -2,6 +2,7 @@
 
 namespace KarmaFW;
 
+use \KarmaFW\App;
 use \KarmaFW\App\Container;
 use \KarmaFW\App\Pipe;
 use \KarmaFW\App\Tools;
@@ -139,6 +140,16 @@ class Kernel
 
             error_log("[App] Error " . $error_code . " : " . $error_message);
 
+
+			// TODO: voir comment bien injecter cette dependance
+			$debugbar = App::getData('debugbar');
+			if ($debugbar) {
+	            if (isset($debugbar['exceptions'])) {
+					$debugbar['exceptions']->addException($e);
+	            }
+	        }
+
+
             $content = null;
             if (ENV == 'dev') {
                 $title = "App CATCHED EXCEPTION CODE " . $error_code;

+ 38 - 0
src/Lib/KarmaMessagesCollector.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace KarmaFW\Lib;
+
+use \DebugBar\DataCollector\MessagesCollector;
+
+use \KarmaFW\App;
+
+
+class KarmaMessagesCollector extends MessagesCollector
+{
+
+	public function addMessage($message, $label = 'info', $isString = true)
+	{
+		parent::addMessage($message, $label, $isString);
+		return $this->messages[ count($this->messages) - 1 ];
+	}
+
+	public function updateMessage($messageObj, $message)
+	{
+        $messageText = $message;
+        $messageHtml = null;
+        if (!is_string($message)) {
+            // Send both text and HTML representations; the text version is used for searches
+            $messageText = $this->getDataFormatter()->formatVar($message);
+            if ($this->isHtmlVarDumperUsed()) {
+                $messageHtml = $this->getVarDumper()->renderVar($message);
+            }
+            $isString = false;
+        }
+        
+        $messageObj['message'] = $messageText;
+        $messageObj['message_html'] = $messageHtml;
+        $messageObj['is_string'] = $isString;
+	}
+
+}
+

+ 5 - 0
src/Routing/Route.php

@@ -36,6 +36,11 @@ class Route
 		}
 	}
 
+	public function getMethods()
+	{
+		return implode(',', $this->methods);
+	}
+
 	// Set route match url
 	public function setMatchUrl($match_url)
 	{

+ 38 - 0
src/Routing/Router.php

@@ -2,6 +2,7 @@
 
 namespace KarmaFW\Routing;
 
+use \KarmaFW\App;
 use \KarmaFW\WebApp;
 use \KarmaFW\App\Pipe;
 use \KarmaFW\Http\Request;
@@ -205,6 +206,16 @@ class Router
 	{
 		$matched_params = $route->getMatchedParams();
 
+        $suffix = empty($route->getName()) ? '' : (' [' . $route->getName() . ']');
+		$service_name = $route->getMethods() . ' ' . $route->getMatchUrl() . $suffix;
+
+        $debugbar = App::getData('debugbar');
+        if ($debugbar) {
+            if (isset($debugbar['time'])) {
+                $debugbar['time']->startMeasure($service_name, $service_name);
+            }
+        }
+
 		if (gettype($callback) == 'array') {
 			//echo " => ARRAY !<br />" . PHP_EOL;
 			//pre($callback, 1);
@@ -218,6 +229,12 @@ class Router
 			$callback($request_uri, $request_method, $route, $matched_params, $response);
 		}
 
+        $debugbar = App::getData('debugbar');
+        if ($debugbar) {
+            if (isset($debugbar['time'])) {
+                $debugbar['time']->stopMeasure($service_name, $service_name);
+            }
+        }
 
 		return true;
 	}
@@ -309,6 +326,16 @@ class Router
 		$matched_params = $route->getMatchedParams();
 		$middlewares_result = ['success' => false];
 
+        $suffix = empty($route->getName()) ? '' : (' [' . $route->getName() . ']');
+		$service_name = $route->getMethods() . ' ' . $route->getMatchUrl() . $suffix;
+
+        $debugbar = App::getData('debugbar');
+        if ($debugbar) {
+            if (isset($debugbar['time'])) {
+                $debugbar['time']->startMeasure($service_name, $service_name);
+            }
+        }
+
 		if (empty($callback)) {
 			// do nothing
 			$route->addMiddleware(function () use ($request, $response, &$middlewares_result) {
@@ -338,9 +365,20 @@ class Router
 			});
 		}
 
+
+
 		$pipe = new Pipe($route->getMiddlewares());
 		$route_response = $pipe->next($request, $response);
 
+
+        $debugbar = App::getData('debugbar');
+        if ($debugbar) {
+            if (isset($debugbar['time'])) {
+                $debugbar['time']->stopMeasure($service_name, $service_name);
+            }
+        }
+
+
 		//pre($middlewares_result);
 		if (! $middlewares_result['success']) {
 			// TODO

+ 31 - 0
src/Templates/PhpTemplate.php

@@ -2,6 +2,8 @@
 
 namespace KarmaFW\Templates;
 
+use \KarmaFW\App;
+
 
 class PhpTemplate
 {
@@ -103,6 +105,7 @@ class PhpTemplate
 	public function fetch($tpl=null, $extra_vars=[], $layout=null, $options=[])
 	{
 		$tpl_dirs = [];
+		$ts_start = microtime(true);
 
 		// user templates
 		if (! empty($this->templates_dirs)) {
@@ -163,6 +166,18 @@ class PhpTemplate
 		}
 
 
+		// TODO: voir comment bien injecter cette dependance
+		$debugbar = App::getData('debugbar');
+		if ($debugbar) {
+			
+			if (isset($debugbar['templates'])) {
+				//$debugbar['templates']->info($tpl);
+
+				$debugbar_message = $debugbar['templates']->addMessage(['tpl' => $tpl]);
+			}
+		}
+
+
 		// plugins. ex: {tr English text} ==> "Texte francais"
 		if (empty($options['no_plugins'])) {
 			if (! empty($this->plugins)) {
@@ -228,8 +243,24 @@ class PhpTemplate
 		if (is_null($layout)) {
 			$layout = $this->layout;
 		}
+		$layout_old = $this->layout;
 		$this->layout = null;
 
+
+		$ts_end = microtime(true);
+		$duration = $ts_end - $ts_start;
+
+		if (! empty($debugbar_message)) {
+			$debugbar['templates']->updateMessage($debugbar_message, [
+				'tpl' => $tpl,
+				'layout' => $layout_old,
+				'content_length' => strlen($content),
+				'duration' => $duration,
+				'duration_str' => round($duration, 5),
+			]);
+		}
+
+
 		if (empty($layout)) {
 			return $content;
 

+ 66 - 0
src/Templates/PhpTemplateCollector.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace KarmaFW\Templates;
+
+use \DebugBar\DataCollector\DataCollector;
+use \DebugBar\DataCollector\Renderable;
+use \DebugBar\DataCollector\AssetProvider;
+
+
+/* USE THIS WITH DEBUGBAR (see http://phpdebugbar.com/ or https://github.com/maximebf/php-debugbar ) */
+
+
+// DO NOT WORK
+
+
+class PhpTemplateCollector extends DataCollector implements Renderable, AssetProvider
+{
+    protected $templates = [];
+
+
+    public function collect()
+    {
+
+        return [
+            'test1',
+            'test2',
+        ];
+
+
+	    return [
+            'nb_templates' => count($this->templates),
+            'templates' => $this->templates,
+	    ];
+    }
+
+    public function getName()
+    {
+        return 'templates';
+    }
+
+
+    public function getWidgets()
+    {
+        return [
+            "templates" => [
+                "icon" => "inbox",
+                "tooltip" => "Templates PHP",
+                //"widget" => "PhpDebugBar.Widget",
+                "widget" => "PhpDebugBar.Widgets.MessagesWidget",
+                "map" => "templates",
+                "default" => "[]"
+            ],
+        ];
+    }
+
+
+    public function getAssets()
+    {
+        return array(
+            //'css' => 'widgets/sqlqueries/widget.css',
+            //'js' => 'widgets/sqlqueries/widget.js'
+        );
+    }
+
+}
+