Browse Source

Use Error.beforeRender and add a test for event stopping.

Mark Story 4 years ago
parent
commit
7435593e35
2 changed files with 21 additions and 4 deletions
  1. 3 3
      src/Error/ErrorTrap.php
  2. 18 1
      tests/TestCase/Error/ErrorTrapTest.php

+ 3 - 3
src/Error/ErrorTrap.php

@@ -16,7 +16,7 @@ use InvalidArgumentException;
  *
  * Using the `register()` method you can attach an ErrorTrap to PHP's default error handler.
  *
- * When errors are trapped, errors are logged (if logging is enabled). Then the `Error.handled` event is triggered.
+ * When errors are trapped, errors are logged (if logging is enabled). Then the `Error.beforeRender` event is triggered.
  * Finally, errors are 'rendered' using the defined renderer. If no error renderer is defined in configuration
  * one of the default implementations will be chosen based on the PHP SAPI.
  */
@@ -93,7 +93,7 @@ class ErrorTrap
      * Will use the configured renderer to generate output
      * and output it.
      *
-     * This method will dispatch the `Error.handled` event which can be listened
+     * This method will dispatch the `Error.beforeRender` event which can be listened
      * to on the global event manager.
      *
      * @param int $code Code of error
@@ -126,7 +126,7 @@ class ErrorTrap
         try {
             // Log first incase rendering or event listeners fail
             $logger->logMessage($error->getLabel(), $error->getMessage());
-            $event = $this->dispatchEvent('Error.handled', ['error' => $error]);
+            $event = $this->dispatchEvent('Error.beforeRender', ['error' => $error]);
             if ($event->isStopped()) {
                 return true;
             }

+ 18 - 1
tests/TestCase/Error/ErrorTrapTest.php

@@ -150,7 +150,7 @@ class ErrorTrapTest extends TestCase
     {
         $trap = new ErrorTrap(['errorRenderer' => TextErrorRenderer::class]);
         $trap->register();
-        $trap->getEventManager()->on('Error.handled', function ($event, PhpError $error) {
+        $trap->getEventManager()->on('Error.beforeRender', function ($event, PhpError $error) {
             $this->assertEquals(E_USER_NOTICE, $error->getCode());
             $this->assertStringContainsString('Oh no it was bad', $error->getMessage());
         });
@@ -161,4 +161,21 @@ class ErrorTrapTest extends TestCase
         restore_error_handler();
         $this->assertNotEmpty($out);
     }
+
+    public function testEventTriggeredAbortRender()
+    {
+        $trap = new ErrorTrap(['errorRenderer' => TextErrorRenderer::class]);
+        $trap->register();
+        $trap->getEventManager()->on('Error.beforeRender', function ($event, PhpError $error) {
+            $this->assertEquals(E_USER_NOTICE, $error->getCode());
+            $this->assertStringContainsString('Oh no it was bad', $error->getMessage());
+            $event->stopPropagation();
+        });
+
+        ob_start();
+        trigger_error('Oh no it was bad', E_USER_NOTICE);
+        $out = ob_get_clean();
+        restore_error_handler();
+        $this->assertSame('', $out);
+    }
 }