diff --git a/src/Symfony/Component/ErrorHandler/Debug.php b/src/Symfony/Component/ErrorHandler/Debug.php index 50d1789f0924..a3c0511d220e 100644 --- a/src/Symfony/Component/ErrorHandler/Debug.php +++ b/src/Symfony/Component/ErrorHandler/Debug.php @@ -29,6 +29,11 @@ public static function enable(): ErrorHandler ini_set('display_errors', 1); } + ini_set('zend.assertions', 1); + ini_set('assert.active', 1); + ini_set('assert.warning', 0); + ini_set('assert.exception', 1); + DebugClassLoader::enable(); return ErrorHandler::register(new ErrorHandler(new BufferingLogger(), true)); diff --git a/src/Symfony/Component/ErrorHandler/ErrorHandler.php b/src/Symfony/Component/ErrorHandler/ErrorHandler.php index b3afb53c9efb..2ac16e380d03 100644 --- a/src/Symfony/Component/ErrorHandler/ErrorHandler.php +++ b/src/Symfony/Component/ErrorHandler/ErrorHandler.php @@ -413,6 +413,11 @@ public function handleError(int $type, string $message, string $file, int $line) $throw = $this->thrownErrors & $type & $level; $type &= $level | $this->screamedErrors; + // Never throw on warnings triggered by assert() + if (E_WARNING === $type && 'a' === $message[0] && 0 === strncmp($message, 'assert(): ', 10)) { + $throw = 0; + } + if (!$type || (!$log && !$throw)) { return !$silenced && $type && $log; } diff --git a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php index 747dbb72dbc1..70710302fd97 100644 --- a/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php +++ b/src/Symfony/Component/ErrorHandler/Tests/ErrorHandlerTest.php @@ -615,4 +615,39 @@ public function errorHandlerWhenLoggingProvider(): iterable } } } + + public function testAssertQuietEval() + { + $ini = [ + ini_set('zend.assertions', 1), + ini_set('assert.active', 1), + ini_set('assert.bail', 0), + ini_set('assert.warning', 1), + ini_set('assert.callback', null), + ini_set('assert.exception', 0), + ]; + + $logger = new BufferingLogger(); + $handler = new ErrorHandler($logger); + $handler = ErrorHandler::register($handler); + + try { + \assert(false); + } finally { + restore_error_handler(); + restore_exception_handler(); + + ini_set('zend.assertions', $ini[0]); + ini_set('assert.active', $ini[1]); + ini_set('assert.bail', $ini[2]); + ini_set('assert.warning', $ini[3]); + ini_set('assert.callback', $ini[4]); + ini_set('assert.exception', $ini[5]); + } + + $logs = $logger->cleanLogs(); + + $this->assertSame('warning', $logs[0][0]); + $this->assertSame('Warning: assert(): assert(false) failed', $logs[0][1]); + } }