From fefcd17ddb51aff59df9bd0359d9e0fe886946d8 Mon Sep 17 00:00:00 2001 From: maximebf Date: Mon, 12 Aug 2013 11:23:48 +1000 Subject: [PATCH] added possibility to name monolog and messages collectors as well as aggregate them into a messages collector --- src/DebugBar/Bridge/MonologCollector.php | 45 +++++++++--- .../MessagesAggregateInterface.php | 21 ++++++ .../DataCollector/MessagesCollector.php | 70 ++++++++++++++----- src/DebugBar/Resources/debugbar.css | 6 +- src/DebugBar/Resources/widgets.js | 3 + 5 files changed, 120 insertions(+), 25 deletions(-) create mode 100644 src/DebugBar/DataCollector/MessagesAggregateInterface.php diff --git a/src/DebugBar/Bridge/MonologCollector.php b/src/DebugBar/Bridge/MonologCollector.php index ddb6c8c..8f09631 100644 --- a/src/DebugBar/Bridge/MonologCollector.php +++ b/src/DebugBar/Bridge/MonologCollector.php @@ -14,6 +14,7 @@ use Monolog\Logger; use Monolog\Handler\AbstractProcessingHandler; use DebugBar\DataCollector\DataCollectorInterface; use DebugBar\DataCollector\Renderable; +use DebugBar\DataCollector\MessagesAggregateInterface; /** * A monolog handler as well as a data collector @@ -22,21 +23,40 @@ use DebugBar\DataCollector\Renderable; * $debugbar->addCollector(new MonologCollector($logger)); * */ -class MonologCollector extends AbstractProcessingHandler implements DataCollectorInterface, Renderable +class MonologCollector extends AbstractProcessingHandler implements DataCollectorInterface, Renderable, MessagesAggregateInterface { + protected $name; + protected $records = array(); - public function __construct(Logger $logger, $level = Logger::DEBUG, $bubble = true) + /** + * @param Logger $logger + * @param int $level + * @param boolean $bubble + * @param string $name + */ + public function __construct(Logger $logger = null, $level = Logger::DEBUG, $bubble = true, $name = 'monolog') { parent::__construct($level, $bubble); - $logger->pushHandler($this); + $this->name = $name; + if ($logger !== null) { + $this->addLogger($logger); + } } + /** + * Adds logger which messages you want to log + * + * @param Logger $logger + */ public function addLogger(Logger $logger) { $logger->pushHandler($this); } + /** + * {@inheritDoc} + */ protected function write(array $record) { $this->records[] = array( @@ -47,6 +67,14 @@ class MonologCollector extends AbstractProcessingHandler implements DataCollecto ); } + /** + * {@inheritDoc} + */ + public function getMessages() + { + return $this->records; + } + /** * {@inheritDoc} */ @@ -63,7 +91,7 @@ class MonologCollector extends AbstractProcessingHandler implements DataCollecto */ public function getName() { - return 'monolog'; + return $this->name; } /** @@ -71,14 +99,15 @@ class MonologCollector extends AbstractProcessingHandler implements DataCollecto */ public function getWidgets() { + $name = $this->getName(); return array( - "logs" => array( + $name => array( "widget" => "PhpDebugBar.Widgets.MessagesWidget", - "map" => "monolog.records", + "map" => "$name.records", "default" => "[]" ), - "logs:badge" => array( - "map" => "monolog.count", + "$name:badge" => array( + "map" => "$name.count", "default" => "null" ) ); diff --git a/src/DebugBar/DataCollector/MessagesAggregateInterface.php b/src/DebugBar/DataCollector/MessagesAggregateInterface.php new file mode 100644 index 0000000..acb9971 --- /dev/null +++ b/src/DebugBar/DataCollector/MessagesAggregateInterface.php @@ -0,0 +1,21 @@ +addMessage($message, $level); + $this->name = $name; } /** @@ -41,19 +45,51 @@ class MessagesCollector extends AbstractLogger implements DataCollectorInterface 'message' => print_r($message, true), 'is_string' => is_string($message), 'label' => $label, - 'time' => microtime(true), - 'memory_usage' => memory_get_usage() + 'time' => microtime(true) ); } /** - * Returns all messages + * Aggregates messages from other collectors * - * @return array + * @param MessagesAggregateInterface $messages + */ + public function aggregate(MessagesAggregateInterface $messages) + { + $this->aggregates[] = $messages; + } + + /** + * {@inheritDoc} */ public function getMessages() { - return $this->messages; + $messages = $this->messages; + foreach ($this->aggregates as $collector) { + $msgs = array_map(function($m) use ($collector) { + $m['collector'] = $collector->getName(); + return $m; + }, $collector->getMessages()); + $messages = array_merge($messages, $msgs); + } + + // sort messages by their timestamp + usort($messages, function($a, $b) { + if ($a['time'] === $b['time']) { + return 0; + } + return $a['time'] < $b['time'] ? -1 : 1; + }); + + return $messages; + } + + /** + * {@inheritDoc} + */ + public function log($level, $message, array $context = array()) + { + $this->addMessage($message, $level); } /** @@ -61,9 +97,10 @@ class MessagesCollector extends AbstractLogger implements DataCollectorInterface */ public function collect() { + $messages = $this->getMessages(); return array( - 'count' => count($this->messages), - 'messages' => $this->messages + 'count' => count($messages), + 'messages' => $messages ); } @@ -72,7 +109,7 @@ class MessagesCollector extends AbstractLogger implements DataCollectorInterface */ public function getName() { - return 'messages'; + return $this->name; } /** @@ -80,14 +117,15 @@ class MessagesCollector extends AbstractLogger implements DataCollectorInterface */ public function getWidgets() { + $name = $this->getName(); return array( - "messages" => array( + "$name" => array( "widget" => "PhpDebugBar.Widgets.MessagesWidget", - "map" => "messages.messages", + "map" => "$name.messages", "default" => "[]" ), - "messages:badge" => array( - "map" => "messages.count", + "$name:badge" => array( + "map" => "$name.count", "default" => "null" ) ); diff --git a/src/DebugBar/Resources/debugbar.css b/src/DebugBar/Resources/debugbar.css index 9d7f712..1f870f6 100644 --- a/src/DebugBar/Resources/debugbar.css +++ b/src/DebugBar/Resources/debugbar.css @@ -174,7 +174,7 @@ div.phpdebugbar-widgets-messages { font-size: 11px; color: red; } - div.phpdebugbar-widgets-messages li.list-item a.backtrace, + div.phpdebugbar-widgets-messages li.list-item span.collector, div.phpdebugbar-widgets-messages li.list-item span.label { float: right; font-size: 12px; @@ -183,6 +183,10 @@ div.phpdebugbar-widgets-messages { margin: 0 2px; text-decoration: none; } + div.phpdebugbar-widgets-messages li.list-item span.collector { + color: #555; + font-style: italic; + } div.phpdebugbar-widgets-messages div.toolbar { position: fixed; bottom: 0; diff --git a/src/DebugBar/Resources/widgets.js b/src/DebugBar/Resources/widgets.js index 7fc627c..d6976ca 100644 --- a/src/DebugBar/Resources/widgets.js +++ b/src/DebugBar/Resources/widgets.js @@ -231,6 +231,9 @@ if (typeof(PhpDebugBar) == 'undefined') { } $('').text(value.label).appendTo(li); + if (value.collector) { + $('').text(value.collector).appendTo(li); + } }}); this.$list.$el.appendTo(this.$el);