Skip to content

Commit 1986cf0

Browse files
janedbalclaude
andcommitted
Move exception class validation to ContainerFactory as requested
- Moved validation from DefaultExceptionTypeResolver constructor to ContainerFactory::validateParameters() - Added bleeding edge feature flag protection to avoid BC break - Use InvalidConfigurationException for proper error handling - Note: The required placement in validateParameters() complicates the code as we cannot use BleedingEdgeToggle::isBleedingEdge() since it's not initialized yet, requiring manual parameter checking 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent e1aeb92 commit 1986cf0

2 files changed

Lines changed: 29 additions & 11 deletions

File tree

src/DependencyInjection/ContainerFactory.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Nette\DI\Definitions\Statement;
88
use Nette\DI\Extensions\ExtensionsExtension;
99
use Nette\DI\Helpers;
10+
use Nette\DI\InvalidConfigurationException;
1011
use Nette\Schema\Context as SchemaContext;
1112
use Nette\Schema\Elements\AnyOf;
1213
use Nette\Schema\Elements\Structure;
@@ -323,6 +324,34 @@ private function validateParameters(array $parameters, array $parametersSchema):
323324
if ($phpVersion['max'] < $phpVersion['min']) {
324325
throw new InvalidPhpVersionException('Invalid PHP version range: phpVersion.max should be greater or equal to phpVersion.min.');
325326
}
327+
328+
if (array_key_exists('featureToggles', $parameters) && is_array($parameters['featureToggles']) && (bool) $parameters['featureToggles']['bleedingEdge']) {
329+
$this->validateExceptionClasses($parameters);
330+
}
331+
}
332+
333+
/**
334+
* @param array<mixed> $parameters
335+
*/
336+
private function validateExceptionClasses(array $parameters): void
337+
{
338+
$reflectionProvider = ReflectionProviderStaticAccessor::getInstance();
339+
340+
if (array_key_exists('checkedExceptionClasses', $parameters) && is_array($parameters['checkedExceptionClasses'])) {
341+
foreach ($parameters['checkedExceptionClasses'] as $checkedExceptionClass) {
342+
if (!$reflectionProvider->hasClass($checkedExceptionClass)) {
343+
throw new InvalidConfigurationException('Class ' . $checkedExceptionClass . ' used in \'checkedExceptionClasses\' does not exist.');
344+
}
345+
}
346+
}
347+
348+
if (array_key_exists('uncheckedExceptionClasses', $parameters) && is_array($parameters['uncheckedExceptionClasses'])) {
349+
foreach ($parameters['uncheckedExceptionClasses'] as $uncheckedExceptionClass) {
350+
if (!$reflectionProvider->hasClass($uncheckedExceptionClass)) {
351+
throw new InvalidConfigurationException('Class ' . $uncheckedExceptionClass . ' used in \'uncheckedExceptionClasses\' does not exist.');
352+
}
353+
}
354+
}
326355
}
327356

328357
/**

src/Rules/Exceptions/DefaultExceptionTypeResolver.php

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
use Nette\Utils\Strings;
66
use PHPStan\Analyser\Scope;
77
use PHPStan\Reflection\ReflectionProvider;
8-
use PHPStan\ShouldNotHappenException;
98
use function count;
109

1110
/**
@@ -28,16 +27,6 @@ public function __construct(
2827
private array $checkedExceptionClasses,
2928
)
3029
{
31-
foreach ($this->checkedExceptionClasses as $checkedExceptionClass) {
32-
if (!$this->reflectionProvider->hasClass($checkedExceptionClass)) {
33-
throw new ShouldNotHappenException('Class ' . $checkedExceptionClass . ' used in \'checkedExceptionClasses\' does not exist.');
34-
}
35-
}
36-
foreach ($this->uncheckedExceptionClasses as $uncheckedExceptionClass) {
37-
if (!$this->reflectionProvider->hasClass($uncheckedExceptionClass)) {
38-
throw new ShouldNotHappenException('Class ' . $uncheckedExceptionClass . ' used in \'uncheckedExceptionClasses\' does not exist.');
39-
}
40-
}
4130
}
4231

4332
public function isCheckedException(string $className, Scope $scope): bool

0 commit comments

Comments
 (0)