From 0defabb726d25b05f9d3d1b0d8d97300756730b6 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Wed, 11 May 2011 18:43:04 +0200 Subject: [PATCH 1/2] Refactored the AbstractHandler to avoid having some dummy write() methods --- src/Monolog/Handler/AbstractHandler.php | 43 ---------- .../Handler/AbstractProcessingHandler.php | 80 +++++++++++++++++++ src/Monolog/Handler/BufferHandler.php | 9 --- src/Monolog/Handler/FingersCrossedHandler.php | 16 ++-- src/Monolog/Handler/FirePHPHandler.php | 2 +- src/Monolog/Handler/GroupHandler.php | 20 ++--- src/Monolog/Handler/MailHandler.php | 2 +- src/Monolog/Handler/NullHandler.php | 7 -- src/Monolog/Handler/StreamHandler.php | 2 +- src/Monolog/Handler/SyslogHandler.php | 2 +- src/Monolog/Handler/TestHandler.php | 2 +- 11 files changed, 103 insertions(+), 82 deletions(-) create mode 100644 src/Monolog/Handler/AbstractProcessingHandler.php diff --git a/src/Monolog/Handler/AbstractHandler.php b/src/Monolog/Handler/AbstractHandler.php index 530e1f16..af0e315e 100644 --- a/src/Monolog/Handler/AbstractHandler.php +++ b/src/Monolog/Handler/AbstractHandler.php @@ -51,24 +51,6 @@ abstract class AbstractHandler implements HandlerInterface return $record['level'] >= $this->level; } - /** - * {@inheritdoc} - */ - public function handle(array $record) - { - if ($record['level'] < $this->level) { - return false; - } - - $record = $this->processRecord($record); - - $record['message'] = $this->getFormatter()->format($record); - - $this->write($record); - - return false === $this->bubble; - } - /** * {@inheritdoc} */ @@ -171,14 +153,6 @@ abstract class AbstractHandler implements HandlerInterface $this->close(); } - /** - * Writes the record down to the log of the implementing handler - * - * @param array $record - * @return void - */ - abstract protected function write(array $record); - /** * Gets the default formatter. * @@ -188,21 +162,4 @@ abstract class AbstractHandler implements HandlerInterface { return new LineFormatter(); } - - /** - * Processes a record. - * - * @param array $record - * @return array - */ - protected function processRecord(array $record) - { - if ($this->processors) { - foreach ($this->processors as $processor) { - $record = call_user_func($processor, $record); - } - } - - return $record; - } } diff --git a/src/Monolog/Handler/AbstractProcessingHandler.php b/src/Monolog/Handler/AbstractProcessingHandler.php new file mode 100644 index 00000000..d3344480 --- /dev/null +++ b/src/Monolog/Handler/AbstractProcessingHandler.php @@ -0,0 +1,80 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Monolog\Handler; + +use Monolog\Logger; +use Monolog\Formatter\FormatterInterface; +use Monolog\Formatter\LineFormatter; + +/** + * Base Handler class providing the Handler structure + * + * Classes extending it should (in most cases) only implement write($record) + * + * @author Jordi Boggiano + * @author Christophe Coevoet + */ +abstract class AbstractProcessingHandler extends AbstractHandler +{ + /** + * {@inheritdoc} + */ + public function handle(array $record) + { + if ($record['level'] < $this->level) { + return false; + } + + $record = $this->processRecord($record); + + $record['message'] = $this->getFormatter()->format($record); + + $this->write($record); + + return false === $this->bubble; + } + + /** + * {@inheritdoc} + */ + public function handleBatch(array $records) + { + foreach ($records as $record) { + $this->handle($record); + } + } + + /** + * Writes the record down to the log of the implementing handler + * + * @param array $record + * @return void + */ + abstract protected function write(array $record); + + /** + * Processes a record. + * + * @param array $record + * @return array + */ + protected function processRecord(array $record) + { + if ($this->processors) { + foreach ($this->processors as $processor) { + $record = call_user_func($processor, $record); + } + } + + return $record; + } +} diff --git a/src/Monolog/Handler/BufferHandler.php b/src/Monolog/Handler/BufferHandler.php index 41f3788a..aac58681 100644 --- a/src/Monolog/Handler/BufferHandler.php +++ b/src/Monolog/Handler/BufferHandler.php @@ -38,7 +38,6 @@ class BufferHandler extends AbstractHandler parent::__construct($level, $bubble); $this->handler = $handler; $this->bufferSize = $bufferSize; - $this->bubble = $bubble; } /** @@ -65,12 +64,4 @@ class BufferHandler extends AbstractHandler { $this->handler->handleBatch($this->buffer); } - - /** - * Implemented to comply with the AbstractHandler requirements. Can not be called. - */ - protected function write(array $record) - { - throw new \BadMethodCallException('This method should not be called directly on the BufferHandler.'); - } } \ No newline at end of file diff --git a/src/Monolog/Handler/FingersCrossedHandler.php b/src/Monolog/Handler/FingersCrossedHandler.php index 255958fc..9e082b57 100644 --- a/src/Monolog/Handler/FingersCrossedHandler.php +++ b/src/Monolog/Handler/FingersCrossedHandler.php @@ -47,6 +47,14 @@ class FingersCrossedHandler extends AbstractHandler $this->stopBuffering = $stopBuffering; } + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + return true; + } + /** * {@inheritdoc} */ @@ -84,12 +92,4 @@ class FingersCrossedHandler extends AbstractHandler { $this->buffering = true; } - - /** - * Implemented to comply with the AbstractHandler requirements. Can not be called. - */ - protected function write(array $record) - { - throw new \BadMethodCallException('This method should not be called directly on the FingersCrossedHandler.'); - } } diff --git a/src/Monolog/Handler/FirePHPHandler.php b/src/Monolog/Handler/FirePHPHandler.php index 9d568029..033f1033 100644 --- a/src/Monolog/Handler/FirePHPHandler.php +++ b/src/Monolog/Handler/FirePHPHandler.php @@ -19,7 +19,7 @@ use Monolog\Formatter\WildfireFormatter; * * @author Eric Clemmons (@ericclemmons) */ -class FirePHPHandler extends AbstractHandler +class FirePHPHandler extends AbstractProcessingHandler { /** * WildFire JSON header message format diff --git a/src/Monolog/Handler/GroupHandler.php b/src/Monolog/Handler/GroupHandler.php index 27eb6959..0d054431 100644 --- a/src/Monolog/Handler/GroupHandler.php +++ b/src/Monolog/Handler/GroupHandler.php @@ -23,7 +23,7 @@ class GroupHandler extends AbstractHandler protected $handlers; /** - * @param Array $handlers Array of Handlers or factory callbacks($record, $fingersCrossedHandler). + * @param array $handlers Array of Handlers. * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(array $handlers, $bubble = false) @@ -31,7 +31,15 @@ class GroupHandler extends AbstractHandler $this->handlers = $handlers; $this->bubble = $bubble; } - + + /** + * {@inheritdoc} + */ + public function isHandling(array $record) + { + return true; + } + /** * {@inheritdoc} */ @@ -52,12 +60,4 @@ class GroupHandler extends AbstractHandler $handler->handleBatch($records); } } - - /** - * Implemented to comply with the AbstractHandler requirements. Can not be called. - */ - protected function write(array $record) - { - throw new \BadMethodCallException('This method should not be called directly on the GroupHandler.'); - } } diff --git a/src/Monolog/Handler/MailHandler.php b/src/Monolog/Handler/MailHandler.php index c8e04990..c9a9e0e5 100644 --- a/src/Monolog/Handler/MailHandler.php +++ b/src/Monolog/Handler/MailHandler.php @@ -16,7 +16,7 @@ namespace Monolog\Handler; * * @author Gyula Sallai */ -abstract class MailHandler extends AbstractHandler +abstract class MailHandler extends AbstractProcessingHandler { /** * {@inheritdoc} diff --git a/src/Monolog/Handler/NullHandler.php b/src/Monolog/Handler/NullHandler.php index f3b7606a..34b46085 100644 --- a/src/Monolog/Handler/NullHandler.php +++ b/src/Monolog/Handler/NullHandler.php @@ -34,11 +34,4 @@ class NullHandler extends AbstractHandler return false === $this->bubble; } - - /** - * {@inheritdoc} - */ - protected function write(array $record) - { - } } \ No newline at end of file diff --git a/src/Monolog/Handler/StreamHandler.php b/src/Monolog/Handler/StreamHandler.php index e837fcc6..7ea58e73 100644 --- a/src/Monolog/Handler/StreamHandler.php +++ b/src/Monolog/Handler/StreamHandler.php @@ -21,7 +21,7 @@ use Monolog\Logger; * * @author Jordi Boggiano */ -class StreamHandler extends AbstractHandler +class StreamHandler extends AbstractProcessingHandler { protected $stream; protected $url; diff --git a/src/Monolog/Handler/SyslogHandler.php b/src/Monolog/Handler/SyslogHandler.php index dc8cc86e..dee2eccd 100644 --- a/src/Monolog/Handler/SyslogHandler.php +++ b/src/Monolog/Handler/SyslogHandler.php @@ -27,7 +27,7 @@ use Monolog\Logger; * * @author Sven Paulus */ -class SyslogHandler extends AbstractHandler +class SyslogHandler extends AbstractProcessingHandler { /** * Translates Monolog log levels to syslog log priorities. diff --git a/src/Monolog/Handler/TestHandler.php b/src/Monolog/Handler/TestHandler.php index 5667645a..76c4639d 100644 --- a/src/Monolog/Handler/TestHandler.php +++ b/src/Monolog/Handler/TestHandler.php @@ -20,7 +20,7 @@ use Monolog\Logger; * * @author Jordi Boggiano */ -class TestHandler extends AbstractHandler +class TestHandler extends AbstractProcessingHandler { protected $records; protected $recordsByLevel; From 6c9946aca876697cb5ddaea59cbb6a34d15f98b0 Mon Sep 17 00:00:00 2001 From: Christophe Coevoet Date: Wed, 11 May 2011 23:59:45 +0200 Subject: [PATCH 2/2] Tweaked the GroupHandler to make it handle a record only when needed --- src/Monolog/Handler/GroupHandler.php | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Monolog/Handler/GroupHandler.php b/src/Monolog/Handler/GroupHandler.php index 0d054431..d2737fa4 100644 --- a/src/Monolog/Handler/GroupHandler.php +++ b/src/Monolog/Handler/GroupHandler.php @@ -11,8 +11,6 @@ namespace Monolog\Handler; -use Monolog\Logger; - /** * Forwards records to multiple handlers * @@ -28,6 +26,12 @@ class GroupHandler extends AbstractHandler */ public function __construct(array $handlers, $bubble = false) { + foreach ($handlers as $handler) { + if (!$handler instanceof HandlerInterface) { + throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.'); + } + } + $this->handlers = $handlers; $this->bubble = $bubble; } @@ -37,7 +41,13 @@ class GroupHandler extends AbstractHandler */ public function isHandling(array $record) { - return true; + foreach ($this->handlers as $handler) { + if ($handler->isHandling($record)) { + return true; + } + } + + return false; } /** @@ -48,6 +58,7 @@ class GroupHandler extends AbstractHandler foreach ($this->handlers as $handler) { $handler->handle($record); } + return false === $this->bubble; }