From 5ce90bd25184ee9893ac9943dbb80c60e612e43a Mon Sep 17 00:00:00 2001 From: Roland Franssen Date: Wed, 25 Apr 2018 11:49:31 +0200 Subject: [PATCH] [DI] Handle invalid bundle configuration class --- UPGRADE-4.1.md | 1 + UPGRADE-5.0.md | 1 + .../Component/DependencyInjection/CHANGELOG.md | 1 + .../DependencyInjection/Extension/Extension.php | 16 ++++++++++++++-- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/UPGRADE-4.1.md b/UPGRADE-4.1.md index a7a8defcb1..e5c71c7527 100644 --- a/UPGRADE-4.1.md +++ b/UPGRADE-4.1.md @@ -23,6 +23,7 @@ DependencyInjection ------------------- * Deprecated the `TypedReference::canBeAutoregistered()` and `TypedReference::getRequiringClass()` methods. + * Deprecated support for auto-discovered extension configuration class which does not implement `ConfigurationInterface`. EventDispatcher --------------- diff --git a/UPGRADE-5.0.md b/UPGRADE-5.0.md index d178fcdc0d..717a5a541a 100644 --- a/UPGRADE-5.0.md +++ b/UPGRADE-5.0.md @@ -20,6 +20,7 @@ DependencyInjection ------------------- * Removed the `TypedReference::canBeAutoregistered()` and `TypedReference::getRequiringClass()` methods. + * Removed support for auto-discovered extension configuration class which does not implement `ConfigurationInterface`. EventDispatcher --------------- diff --git a/src/Symfony/Component/DependencyInjection/CHANGELOG.md b/src/Symfony/Component/DependencyInjection/CHANGELOG.md index 0c91a4e381..fb9d0ef90c 100644 --- a/src/Symfony/Component/DependencyInjection/CHANGELOG.md +++ b/src/Symfony/Component/DependencyInjection/CHANGELOG.md @@ -9,6 +9,7 @@ CHANGELOG * added support for service's decorators autowiring * deprecated the `TypedReference::canBeAutoregistered()` and `TypedReference::getRequiringClass()` methods * environment variables are validated when used in extension configuration + * deprecated support for auto-discovered extension configuration class which does not implement `ConfigurationInterface` 4.0.0 ----- diff --git a/src/Symfony/Component/DependencyInjection/Extension/Extension.php b/src/Symfony/Component/DependencyInjection/Extension/Extension.php index 9542c740e1..7bb8ae3b5a 100644 --- a/src/Symfony/Component/DependencyInjection/Extension/Extension.php +++ b/src/Symfony/Component/DependencyInjection/Extension/Extension.php @@ -82,11 +82,23 @@ abstract class Extension implements ExtensionInterface, ConfigurationExtensionIn $class = get_class($this); $class = substr_replace($class, '\Configuration', strrpos($class, '\\')); $class = $container->getReflectionClass($class); - $constructor = $class ? $class->getConstructor() : null; - if ($class && (!$constructor || !$constructor->getNumberOfRequiredParameters())) { + if (!$class) { + return null; + } + + if (!$class->implementsInterface(ConfigurationInterface::class)) { + @trigger_error(sprintf('Not implementing "%s" in the extension configuration class "%s" is deprecated since Symfony 4.1.', ConfigurationInterface::class, $class->getName()), E_USER_DEPRECATED); + //throw new LogicException(sprintf('The extension configuration class "%s" must implement "%s".', $class->getName(), ConfigurationInterface::class)); + + return null; + } + + if (!($constructor = $class->getConstructor()) || !$constructor->getNumberOfRequiredParameters()) { return $class->newInstance(); } + + return null; } final protected function processConfiguration(ConfigurationInterface $configuration, array $configs)