Просмотр исходного кода

Fixed callback factory for the FingersCrossedHandler

Christophe Coevoet 15 лет назад
Родитель
Сommit
e32886e26f

+ 5 - 2
src/Monolog/Handler/FingersCrossedHandler.php

@@ -62,8 +62,11 @@ class FingersCrossedHandler extends AbstractHandler
             }
             if ($record['level'] >= $this->actionLevel) {
                 $this->buffering = false;
-                if (!$this->handler instanceof AbstractHandler) {
-                    $this->handler = $this->handler($record, $this);
+                if (!$this->handler instanceof HandlerInterface) {
+                    $this->handler = call_user_func_array($this->handler, array($record, $this));
+                }
+                if (!$this->handler instanceof HandlerInterface) {
+                    throw new \RuntimeException("The factory callback should return an HandlerInterface");
                 }
                 foreach ($this->buffer as $record) {
                     $this->handler->handle($record);

+ 26 - 0
tests/Monolog/Handler/FingersCrossedHandlerTest.php

@@ -51,6 +51,32 @@ class FingersCrossedHandlerTest extends \PHPUnit_Framework_TestCase
         $this->assertFalse($test->hasDebugRecords());
     }
 
+    public function testHandleWithCallback()
+    {
+        $test = new TestHandler();
+        $handler = new FingersCrossedHandler(function($record, $handler) use ($test) {
+                    return $test;
+                });
+        $handler->handle($this->getRecord(Logger::DEBUG));
+        $handler->handle($this->getRecord(Logger::INFO));
+        $this->assertFalse($test->hasDebugRecords());
+        $this->assertFalse($test->hasInfoRecords());
+        $handler->handle($this->getRecord(Logger::WARNING));
+        $this->assertTrue($test->hasInfoRecords());
+        $this->assertTrue(count($test->getRecords()) === 3);
+    }
+
+    /**
+     * @expectedException RuntimeException
+     */
+    public function testHandleWithBadCallbackThrowsException()
+    {
+        $handler = new FingersCrossedHandler(function($record, $handler) {
+                    return 'foo';
+                });
+        $handler->handle($this->getRecord(Logger::WARNING));
+    }
+
     protected function getRecord($level = Logger::WARNING)
     {
         return array(