From 8e7f51f27f2ad15c0cdc919d3a23738ba1f76f6b Mon Sep 17 00:00:00 2001 From: Hennadiy Verkh Date: Mon, 17 Mar 2014 16:06:57 +0100 Subject: [PATCH] Fixed passing Closure as parameter to minMaxHandler. --- src/Monolog/Handler/MinMaxHandler.php | 24 +++++++++++---- tests/Monolog/Handler/MinMaxHandlerTest.php | 33 ++++++++++++++++++++- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/src/Monolog/Handler/MinMaxHandler.php b/src/Monolog/Handler/MinMaxHandler.php index 31caf9f2..f310555e 100644 --- a/src/Monolog/Handler/MinMaxHandler.php +++ b/src/Monolog/Handler/MinMaxHandler.php @@ -12,7 +12,7 @@ use Monolog\Logger; class MinMaxHandler extends AbstractHandler { /** - * Handler or factory callable($record, $fingersCrossedHandler) + * Handler or factory callable($record, $this) * * @var callable|\Monolog\Handler\HandlerInterface */ @@ -37,12 +37,10 @@ class MinMaxHandler extends AbstractHandler protected $bubble; /** - * @param callable|HandlerInterface $handler Handler or factory callable($record, $fingersCrossedHandler). - * @param int $minLevel - * @param int $maxLevel + * @param callable|HandlerInterface $handler Handler or factory callable($record, $this). + * @param int $minLevel Minimum level for logs that are passes to handler + * @param int $maxLevel Maximum level for logs that are passes to handler * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not - * - * @internal param \TtLibrary\Log\Handler\Maximum $int log level */ public function __construct($handler, $minLevel = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, $bubble = true) { @@ -70,6 +68,20 @@ class MinMaxHandler extends AbstractHandler return false; } + // The same logic as in FingersCrossedHandler + if (!$this->handler instanceof HandlerInterface) { + if (!is_callable($this->handler)) { + throw new \RuntimeException( + "The given handler (" . json_encode($this->handler) + . ") is not a callable nor a Monolog\\Handler\\HandlerInterface object" + ); + } + $this->handler = call_user_func($this->handler, $record, $this); + if (!$this->handler instanceof HandlerInterface) { + throw new \RuntimeException("The factory callable should return a HandlerInterface"); + } + } + if ($this->processors) { foreach ($this->processors as $processor) { $record = call_user_func($processor, $record); diff --git a/tests/Monolog/Handler/MinMaxHandlerTest.php b/tests/Monolog/Handler/MinMaxHandlerTest.php index bd18571c..d7ce5c3d 100644 --- a/tests/Monolog/Handler/MinMaxHandlerTest.php +++ b/tests/Monolog/Handler/MinMaxHandlerTest.php @@ -93,4 +93,35 @@ class MinMaxHandlerTest extends TestCase $this->assertFalse($handler->handle($this->getRecord(Logger::INFO))); $this->assertFalse($handler->handle($this->getRecord(Logger::WARNING))); } -} + + /** + * @covers Monolog\Handler\MinMaxHandler::handle + */ + public function testHandleWithCallback() + { + $test = new TestHandler(); + $handler = new MinMaxHandler( + function ($record, $handler) use ($test) { + return $test; + }, Logger::INFO, Logger::NOTICE, false + ); + $handler->handle($this->getRecord(Logger::DEBUG)); + $handler->handle($this->getRecord(Logger::INFO)); + $this->assertFalse($test->hasDebugRecords()); + $this->assertTrue($test->hasInfoRecords()); + } + + /** + * @covers Monolog\Handler\MinMaxHandler::handle + * @expectedException \RuntimeException + */ + public function testHandleWithBadCallbackThrowsException() + { + $handler = new MinMaxHandler( + function ($record, $handler) { + return 'foo'; + } + ); + $handler->handle($this->getRecord(Logger::WARNING)); + } +} \ No newline at end of file