From 34462a1ee9cbafa0ab3fa52f771905741088865a Mon Sep 17 00:00:00 2001 From: erikn69 Date: Sat, 10 Feb 2024 04:46:40 -0500 Subject: [PATCH] Create ObjectCountCollector for count class/objects (#571) * Create ObjectCountCollector for count class/objects * Added ObjectCountCollector demo --- demo/index.php | 6 ++ .../DataCollector/ObjectCountCollector.php | 99 +++++++++++++++++++ src/DebugBar/Resources/widgets.css | 11 +++ 3 files changed, 116 insertions(+) create mode 100644 src/DebugBar/DataCollector/ObjectCountCollector.php diff --git a/demo/index.php b/demo/index.php index 51dae09..27a887f 100644 --- a/demo/index.php +++ b/demo/index.php @@ -16,6 +16,12 @@ $debugbar['messages']->addMessage('world', 'warning'); $debugbar['messages']->addMessage(array('toto' => array('titi', 'tata'))); $debugbar['messages']->addMessage('oups', 'error'); +$classDemo = array('FirstClass', 'SecondClass', 'ThirdClass'); +$debugbar->addCollector(new \DebugBar\DataCollector\ObjectCountCollector()); +for ($i = 0; $i <=20; $i++) { + $debugbar['counter']->countClass($classDemo[rand(0, 2)]); +} + $debugbar['time']->startMeasure('render'); render_demo_page(function() { diff --git a/src/DebugBar/DataCollector/ObjectCountCollector.php b/src/DebugBar/DataCollector/ObjectCountCollector.php new file mode 100644 index 0000000..fbbe307 --- /dev/null +++ b/src/DebugBar/DataCollector/ObjectCountCollector.php @@ -0,0 +1,99 @@ +name = $name; + $this->icon = $icon; + } + + /** + * @param string|mixed $class + * @param int $count + */ + public function countClass($class, $count = 1) { + if (! is_string($class)) { + $class = get_class($class); + } + + $this->classList[$class] = ($this->classList[$class] ?? 0) + $count; + $this->classCount += $count; + } + + /** + * {@inheritDoc} + */ + public function collect() + { + arsort($this->classList, SORT_NUMERIC); + + if (! $this->getXdebugLinkTemplate()) { + return ['data' => $this->classList, 'count' => $this->classCount, 'is_counter' => true]; + } + + $data = []; + foreach ($this->classList as $class => $count) { + $reflector = class_exists($class) ? new \ReflectionClass($class) : null; + + if ($reflector && $link = $this->getXdebugLink($reflector->getFileName())) { + $data[$class . ''] = $count; + } else { + $data[$class] = $count; + } + } + + return ['data' => $data, 'count' => $this->classCount, 'is_counter' => true]; + } + + /** + * {@inheritDoc} + */ + public function getName() + { + return $this->name; + } + + /** + * {@inheritDoc} + */ + public function getWidgets() + { + $name = $this->getName(); + + return [ + "$name" => [ + 'icon' => $this->icon, + 'widget' => 'PhpDebugBar.Widgets.HtmlVariableListWidget', + 'map' => "$name.data", + 'default' => '{}' + ], + "$name:badge" => [ + 'map' => "$name.count", + 'default' => 0 + ] + ]; + } +} diff --git a/src/DebugBar/Resources/widgets.css b/src/DebugBar/Resources/widgets.css index e00c164..defc897 100644 --- a/src/DebugBar/Resources/widgets.css +++ b/src/DebugBar/Resources/widgets.css @@ -146,6 +146,17 @@ dl.phpdebugbar-widgets-kvlist { cursor: pointer; min-height: 17px; } + .phpdebugbar-widgets-kvlist .phpdebugbar-widgets-editor-link { + margin-left: 8px; + color: #888; + } + .phpdebugbar-widgets-kvlist .phpdebugbar-widgets-editor-link:before { + content: "\f08e"; + font-family: PhpDebugbarFontAwesome; + margin-left: 4px; + margin-right: 4px; + font-size: 12px; + } /* -------------------------------------- */