diff --git a/.github/expected-missing-return-types.diff b/.github/expected-missing-return-types.diff index ce82fd236a718..9864a94dfee26 100644 --- a/.github/expected-missing-return-types.diff +++ b/.github/expected-missing-return-types.diff @@ -60,17 +60,6 @@ index b275304d7d..48ba999884 100644 + public function getTime(): int { $time = 0; -diff --git a/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php b/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php -index 448da935d9..06c97eb70c 100644 ---- a/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php -+++ b/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php -@@ -40,5 +40,5 @@ class ContainerAwareLoader extends Loader - * @return void - */ -- public function addFixture(FixtureInterface $fixture) -+ public function addFixture(FixtureInterface $fixture): void - { - if ($fixture instanceof ContainerAwareInterface) { diff --git a/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php b/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php index 1ce0ffd40c..585265fb38 100644 --- a/src/Symfony/Bridge/Doctrine/DependencyInjection/AbstractDoctrineExtension.php @@ -566,17 +555,17 @@ index 94b95e5029..c8a563163e 100644 { if (!$configuration) { diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Application.php b/src/Symfony/Bundle/FrameworkBundle/Console/Application.php -index 02709ba649..5a3e972793 100644 +index 0451b31fe1..14806da8ee 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Application.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Application.php -@@ -56,5 +56,5 @@ class Application extends BaseApplication +@@ -55,5 +55,5 @@ class Application extends BaseApplication * @return void */ - public function reset() + public function reset(): void { if ($this->kernel->getContainer()->has('services_resetter')) { -@@ -145,5 +145,5 @@ class Application extends BaseApplication +@@ -137,5 +137,5 @@ class Application extends BaseApplication * @return void */ - protected function registerCommands() @@ -3733,10 +3722,10 @@ index 3f070dcc0c..aa0e5186bf 100644 { foreach ($container->findTaggedServiceIds('auto_alias') as $serviceId => $tags) { diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php -index e28b60c6ea..a5b3d3d00b 100644 +index 3e94ed1b2c..1fd3fa27ea 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php -@@ -73,5 +73,5 @@ class AutowirePass extends AbstractRecursivePass +@@ -72,5 +72,5 @@ class AutowirePass extends AbstractRecursivePass * @return void */ - public function process(ContainerBuilder $container) @@ -4190,27 +4179,6 @@ index 3ea2228b94..f1d7078383 100644 + protected function load(string $file): mixed { return require $file; -diff --git a/src/Symfony/Component/DependencyInjection/ContainerAwareInterface.php b/src/Symfony/Component/DependencyInjection/ContainerAwareInterface.php -index 9b3709c965..97b54712c9 100644 ---- a/src/Symfony/Component/DependencyInjection/ContainerAwareInterface.php -+++ b/src/Symfony/Component/DependencyInjection/ContainerAwareInterface.php -@@ -26,4 +26,4 @@ interface ContainerAwareInterface - * @return void - */ -- public function setContainer(?ContainerInterface $container); -+ public function setContainer(?ContainerInterface $container): void; - } -diff --git a/src/Symfony/Component/DependencyInjection/ContainerAwareTrait.php b/src/Symfony/Component/DependencyInjection/ContainerAwareTrait.php -index 4174fec8d0..f6a7b2da12 100644 ---- a/src/Symfony/Component/DependencyInjection/ContainerAwareTrait.php -+++ b/src/Symfony/Component/DependencyInjection/ContainerAwareTrait.php -@@ -31,5 +31,5 @@ trait ContainerAwareTrait - * @return void - */ -- public function setContainer(ContainerInterface $container = null) -+ public function setContainer(ContainerInterface $container = null): void - { - if (1 > \func_num_args()) { diff --git a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php b/src/Symfony/Component/DependencyInjection/ContainerBuilder.php index a7a9c145aa..bd16e937ca 100644 --- a/src/Symfony/Component/DependencyInjection/ContainerBuilder.php @@ -4631,52 +4599,52 @@ index 1ede090384..7b6b63c599 100644 { throw new LogicException('Impossible to call remove() on a frozen ParameterBag.'); diff --git a/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php b/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php -index c1cd9087f0..a9efa77a6d 100644 +index 40447dbbcb..9d0cd64d85 100644 --- a/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php +++ b/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php -@@ -35,5 +35,5 @@ class ParameterBag implements ParameterBagInterface +@@ -36,5 +36,5 @@ class ParameterBag implements ParameterBagInterface * @return void */ - public function clear() + public function clear(): void { $this->parameters = []; -@@ -43,5 +43,5 @@ class ParameterBag implements ParameterBagInterface +@@ -44,5 +44,5 @@ class ParameterBag implements ParameterBagInterface * @return void */ - public function add(array $parameters) + public function add(array $parameters): void { foreach ($parameters as $key => $value) { -@@ -104,5 +104,5 @@ class ParameterBag implements ParameterBagInterface +@@ -105,5 +105,5 @@ class ParameterBag implements ParameterBagInterface * @return void */ - public function set(string $name, array|bool|string|int|float|\UnitEnum|null $value) + public function set(string $name, array|bool|string|int|float|\UnitEnum|null $value): void { if (is_numeric($name)) { -@@ -122,5 +122,5 @@ class ParameterBag implements ParameterBagInterface +@@ -121,5 +121,5 @@ class ParameterBag implements ParameterBagInterface * @throws ParameterNotFoundException if the parameter is not defined */ - public function deprecate(string $name, string $package, string $version, string $message = 'The parameter "%s" is deprecated.') + public function deprecate(string $name, string $package, string $version, string $message = 'The parameter "%s" is deprecated.'): void { if (!\array_key_exists($name, $this->parameters)) { -@@ -139,5 +139,5 @@ class ParameterBag implements ParameterBagInterface +@@ -138,5 +138,5 @@ class ParameterBag implements ParameterBagInterface * @return void */ - public function remove(string $name) + public function remove(string $name): void { unset($this->parameters[$name], $this->deprecatedParameters[$name]); -@@ -147,5 +147,5 @@ class ParameterBag implements ParameterBagInterface +@@ -146,5 +146,5 @@ class ParameterBag implements ParameterBagInterface * @return void */ - public function resolve() + public function resolve(): void { if ($this->resolved) { -@@ -259,5 +259,5 @@ class ParameterBag implements ParameterBagInterface +@@ -258,5 +258,5 @@ class ParameterBag implements ParameterBagInterface * @return bool */ - public function isResolved() @@ -8297,31 +8265,31 @@ index af21469b1c..7b024368c5 100644 { } diff --git a/src/Symfony/Component/HttpKernel/Bundle/BundleInterface.php b/src/Symfony/Component/HttpKernel/Bundle/BundleInterface.php -index fe200629f4..692c41ec53 100644 +index 400a9e0c92..870cbe80e5 100644 --- a/src/Symfony/Component/HttpKernel/Bundle/BundleInterface.php +++ b/src/Symfony/Component/HttpKernel/Bundle/BundleInterface.php -@@ -29,5 +29,5 @@ interface BundleInterface extends ContainerAwareInterface +@@ -28,5 +28,5 @@ interface BundleInterface * @return void */ - public function boot(); + public function boot(): void; /** -@@ -36,5 +36,5 @@ interface BundleInterface extends ContainerAwareInterface +@@ -35,5 +35,5 @@ interface BundleInterface * @return void */ - public function shutdown(); + public function shutdown(): void; /** -@@ -45,5 +45,5 @@ interface BundleInterface extends ContainerAwareInterface +@@ -44,5 +44,5 @@ interface BundleInterface * @return void */ - public function build(ContainerBuilder $container); + public function build(ContainerBuilder $container): void; /** -@@ -72,4 +72,4 @@ interface BundleInterface extends ContainerAwareInterface +@@ -71,4 +71,4 @@ interface BundleInterface * @return void */ - public function setContainer(?ContainerInterface $container); diff --git a/UPGRADE-7.0.md b/UPGRADE-7.0.md index 5a3e9e011015d..6080db7be0151 100644 --- a/UPGRADE-7.0.md +++ b/UPGRADE-7.0.md @@ -17,6 +17,18 @@ Console * Passing null to `*Command::setApplication()`, `*FormatterStyle::setForeground/setBackground()`, `Helper::setHelpSet()`, `Input*::setDefault()` and `Question::setAutocompleterCallback/setValidator()` must be done explicitly * Remove `StringInput::REGEX_STRING` +DependencyInjection +------------------- + + * Remove `#[MapDecorated]`, use `#[AutowireDecorated]` instead + * Remove `ProxyHelper`, use `Symfony\Component\VarExporter\ProxyHelper` instead + * Remove `ReferenceSetArgumentTrait` + * Remove support of `@required` annotation, use the `Symfony\Contracts\Service\Attribute\Required` attribute instead + * Passing `null` to `ContainerAwareTrait::setContainer()` must be done explicitly + * Remove `PhpDumper` options `inline_factories_parameter` and `inline_class_loader_parameter`, use options `inline_factories` and `inline_class_loader` instead + * Parameter names of `ParameterBag` cannot be numerics + * Remove `ContainerAwareInterface` and `ContainerAwareTrait`, use dependency injection instead + DoctrineBridge -------------- @@ -25,6 +37,7 @@ DoctrineBridge * Remove `RememberMeTokenProviderDoctrineSchemaSubscriber`, use `RememberMeTokenProviderDoctrineSchemaListener` instead * Remove `DbalLogger`, use a middleware instead * Remove `DoctrineDataCollector::addLogger()`, use a `DebugDataHolder` instead + * Remove `ContainerAwareLoader`, use dependency injection in your fixtures instead * `ContainerAwareEventManager::getListeners()` must be called with an event name * DoctrineBridge now requires `doctrine/event-manager:^2` * Add parameter `$isSameDatabase` to `DoctrineTokenProvider::configureSchema()` diff --git a/src/Symfony/Bridge/Doctrine/CHANGELOG.md b/src/Symfony/Bridge/Doctrine/CHANGELOG.md index cc460b45284b5..b4e06a9eb0ba5 100644 --- a/src/Symfony/Bridge/Doctrine/CHANGELOG.md +++ b/src/Symfony/Bridge/Doctrine/CHANGELOG.md @@ -9,6 +9,7 @@ CHANGELOG * Remove `RememberMeTokenProviderDoctrineSchemaSubscriber`, use `RememberMeTokenProviderDoctrineSchemaListener` instead * Remove `DbalLogger`, use a middleware instead * Remove `DoctrineDataCollector::addLogger()`, use a `DebugDataHolder` instead + * Remove `ContainerAwareLoader`, use dependency injection in your fixtures instead * `ContainerAwareEventManager::getListeners()` must be called with an event name * DoctrineBridge now requires `doctrine/event-manager:^2` * Add parameter `$isSameDatabase` to `DoctrineTokenProvider::configureSchema()` diff --git a/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php b/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php deleted file mode 100644 index 448da935d9347..0000000000000 --- a/src/Symfony/Bridge/Doctrine/DataFixtures/ContainerAwareLoader.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Bridge\Doctrine\DataFixtures; - -use Doctrine\Common\DataFixtures\FixtureInterface; -use Doctrine\Common\DataFixtures\Loader; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; - -trigger_deprecation('symfony/dependency-injection', '6.4', '"%s" is deprecated, use dependency injection in your fixtures instead.', ContainerAwareLoader::class); - -/** - * Doctrine data fixtures loader that injects the service container into - * fixture objects that implement ContainerAwareInterface. - * - * Note: Use of this class requires the Doctrine data fixtures extension, which - * is a suggested dependency for Symfony. - * - * @deprecated since Symfony 6.4, use dependency injection in your fixtures instead - */ -class ContainerAwareLoader extends Loader -{ - private ContainerInterface $container; - - public function __construct(ContainerInterface $container) - { - $this->container = $container; - } - - /** - * @return void - */ - public function addFixture(FixtureInterface $fixture) - { - if ($fixture instanceof ContainerAwareInterface) { - $fixture->setContainer($this->container); - } - - parent::addFixture($fixture); - } -} diff --git a/src/Symfony/Bridge/Doctrine/Tests/DataFixtures/ContainerAwareLoaderTest.php b/src/Symfony/Bridge/Doctrine/Tests/DataFixtures/ContainerAwareLoaderTest.php deleted file mode 100644 index 31bdf5e213783..0000000000000 --- a/src/Symfony/Bridge/Doctrine/Tests/DataFixtures/ContainerAwareLoaderTest.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Bridge\Doctrine\Tests\DataFixtures; - -use PHPUnit\Framework\TestCase; -use Symfony\Bridge\Doctrine\DataFixtures\ContainerAwareLoader; -use Symfony\Bridge\Doctrine\Tests\Fixtures\ContainerAwareFixture; -use Symfony\Component\DependencyInjection\ContainerInterface; - -/** - * @group legacy - */ -class ContainerAwareLoaderTest extends TestCase -{ - public function testShouldSetContainerOnContainerAwareFixture() - { - $container = $this->createMock(ContainerInterface::class); - $loader = new ContainerAwareLoader($container); - $fixture = new ContainerAwareFixture(); - - $loader->addFixture($fixture); - - $this->assertSame($container, $fixture->container); - } -} diff --git a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/ContainerAwareFixture.php b/src/Symfony/Bridge/Doctrine/Tests/Fixtures/ContainerAwareFixture.php deleted file mode 100644 index fdf8e04bea818..0000000000000 --- a/src/Symfony/Bridge/Doctrine/Tests/Fixtures/ContainerAwareFixture.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Bridge\Doctrine\Tests\Fixtures; - -use Doctrine\Common\DataFixtures\FixtureInterface; -use Doctrine\Persistence\ObjectManager; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; -use Symfony\Component\DependencyInjection\ContainerInterface; - -/** - * @deprecated since Symfony 6.4, to be removed in 7.0 - */ -class ContainerAwareFixture implements FixtureInterface, ContainerAwareInterface -{ - public ?ContainerInterface $container = null; - - public function setContainer(?ContainerInterface $container): void - { - $this->container = $container; - } - - public function load(ObjectManager $manager): void - { - } -} diff --git a/src/Symfony/Bundle/FrameworkBundle/Console/Application.php b/src/Symfony/Bundle/FrameworkBundle/Console/Application.php index 02709ba64923f..0451b31fe1490 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Console/Application.php +++ b/src/Symfony/Bundle/FrameworkBundle/Console/Application.php @@ -19,7 +19,6 @@ use Symfony\Component\Console\Output\ConsoleOutputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\HttpKernel\Bundle\Bundle; use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\HttpKernel\KernelInterface; @@ -112,14 +111,7 @@ public function get(string $name): Command { $this->registerCommands(); - $command = parent::get($name); - - if ($command instanceof ContainerAwareInterface) { - trigger_deprecation('symfony/dependency-injection', '6.4', 'Relying on "%s" to get the container in "%s" is deprecated, register the command as a service and use dependency injection instead.', ContainerAwareInterface::class, get_debug_type($command)); - $command->setContainer($this->kernel->getContainer()); - } - - return $command; + return parent::get($name); } public function all(string $namespace = null): array diff --git a/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php b/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php index 3449740bf3c34..af8b4942907c7 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php +++ b/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php @@ -11,7 +11,6 @@ namespace Symfony\Bundle\FrameworkBundle\Controller; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\HttpKernel\Controller\ContainerControllerResolver; /** @@ -25,10 +24,6 @@ protected function instantiateController(string $class): object { $controller = parent::instantiateController($class); - if ($controller instanceof ContainerAwareInterface) { - trigger_deprecation('symfony/dependency-injection', '6.4', 'Relying on "%s" to get the container in "%s" is deprecated, register the controller as a service and use dependency injection instead.', ContainerAwareInterface::class, get_debug_type($controller)); - $controller->setContainer($this->container); - } if ($controller instanceof AbstractController) { if (null === $previousContainer = $controller->setContainer($this->container)) { throw new \LogicException(sprintf('"%s" has no container set, did you forget to define it as a service subscriber?', $class)); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/ControllerResolverTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/ControllerResolverTest.php index 5488111ee1ed5..0c51924a4aed0 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/ControllerResolverTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/ControllerResolverTest.php @@ -13,74 +13,15 @@ use Psr\Container\ContainerInterface as Psr11ContainerInterface; use Psr\Log\LoggerInterface; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver; use Symfony\Component\DependencyInjection\Container; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Tests\Controller\ContainerControllerResolverTest; class ControllerResolverTest extends ContainerControllerResolverTest { - use ExpectDeprecationTrait; - - /** - * @group legacy - */ - public function testGetControllerOnContainerAware() - { - $resolver = $this->createControllerResolver(); - $request = Request::create('/'); - $request->attributes->set('_controller', 'Symfony\Bundle\FrameworkBundle\Tests\Controller\ContainerAwareController::testAction'); - - $this->expectDeprecation('Since symfony/dependency-injection 6.4: Relying on "Symfony\Component\DependencyInjection\ContainerAwareInterface" to get the container in "Symfony\Bundle\FrameworkBundle\Tests\Controller\ContainerAwareController" is deprecated, register the controller as a service and use dependency injection instead.'); - $controller = $resolver->getController($request); - - $this->assertInstanceOf(ContainerAwareController::class, $controller[0]); - $this->assertInstanceOf(ContainerInterface::class, $controller[0]->getContainer()); - $this->assertSame('testAction', $controller[1]); - } - - /** - * @group legacy - */ - public function testGetControllerOnContainerAwareInvokable() - { - $resolver = $this->createControllerResolver(); - $request = Request::create('/'); - $request->attributes->set('_controller', 'Symfony\Bundle\FrameworkBundle\Tests\Controller\ContainerAwareController'); - - $this->expectDeprecation('Since symfony/dependency-injection 6.4: Relying on "Symfony\Component\DependencyInjection\ContainerAwareInterface" to get the container in "Symfony\Bundle\FrameworkBundle\Tests\Controller\ContainerAwareController" is deprecated, register the controller as a service and use dependency injection instead.'); - $controller = $resolver->getController($request); - - $this->assertInstanceOf(ContainerAwareController::class, $controller); - $this->assertInstanceOf(ContainerInterface::class, $controller->getContainer()); - } - - /** - * @group legacy - */ - public function testContainerAwareControllerGetsContainerWhenNotSet() - { - class_exists(AbstractControllerTest::class); - - $controller = new ContainerAwareController(); - - $container = new Container(); - $container->set(TestAbstractController::class, $controller); - - $resolver = $this->createControllerResolver(null, $container); - - $request = Request::create('/'); - $request->attributes->set('_controller', TestAbstractController::class.'::testAction'); - - $this->expectDeprecation('Since symfony/dependency-injection 6.4: Relying on "Symfony\Component\DependencyInjection\ContainerAwareInterface" to get the container in "Symfony\Bundle\FrameworkBundle\Tests\Controller\ContainerAwareController" is deprecated, register the controller as a service and use dependency injection instead.'); - $this->assertSame([$controller, 'testAction'], $resolver->getController($request)); - $this->assertSame($container, $controller->getContainer()); - } - public function testAbstractControllerGetsContainerWhenNotSet() { $this->expectException(\LogicException::class); @@ -183,29 +124,6 @@ protected function createMockContainer() } } -class ContainerAwareController implements ContainerAwareInterface -{ - private ?ContainerInterface $container = null; - - public function setContainer(?ContainerInterface $container): void - { - $this->container = $container; - } - - public function getContainer(): ?ContainerInterface - { - return $this->container; - } - - public function testAction() - { - } - - public function __invoke() - { - } -} - class DummyController extends AbstractController { public function getContainer(): Psr11ContainerInterface diff --git a/src/Symfony/Component/DependencyInjection/Argument/ReferenceSetArgumentTrait.php b/src/Symfony/Component/DependencyInjection/Argument/ReferenceSetArgumentTrait.php deleted file mode 100644 index 293d9a0a14328..0000000000000 --- a/src/Symfony/Component/DependencyInjection/Argument/ReferenceSetArgumentTrait.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Argument; - -trigger_deprecation('symfony/dependency-injection', '6.1', '"%s" is deprecated.', ReferenceSetArgumentTrait::class); - -use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Reference; - -/** - * @author Titouan Galopin - * @author Nicolas Grekas - * - * @deprecated since Symfony 6.1 - */ -trait ReferenceSetArgumentTrait -{ - private array $values; - - /** - * @param Reference[] $values - */ - public function __construct(array $values) - { - $this->setValues($values); - } - - /** - * @return Reference[] - */ - public function getValues(): array - { - return $this->values; - } - - /** - * @param Reference[] $values The service references to put in the set - * - * @return void - */ - public function setValues(array $values) - { - foreach ($values as $k => $v) { - if (null !== $v && !$v instanceof Reference) { - throw new InvalidArgumentException(sprintf('A "%s" must hold only Reference instances, "%s" given.', __CLASS__, get_debug_type($v))); - } - } - - $this->values = $values; - } -} diff --git a/src/Symfony/Component/DependencyInjection/Attribute/MapDecorated.php b/src/Symfony/Component/DependencyInjection/Attribute/MapDecorated.php deleted file mode 100644 index d63f0567cbd5b..0000000000000 --- a/src/Symfony/Component/DependencyInjection/Attribute/MapDecorated.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Attribute; - -trigger_deprecation('symfony/dependency-injection', '6.3', 'The "%s" class is deprecated, use "%s" instead.', MapDecorated::class, AutowireDecorated::class); - -/** - * @deprecated since Symfony 6.3, use AutowireDecorated instead - */ -#[\Attribute(\Attribute::TARGET_PARAMETER)] -class MapDecorated -{ -} diff --git a/src/Symfony/Component/DependencyInjection/CHANGELOG.md b/src/Symfony/Component/DependencyInjection/CHANGELOG.md index f314f4c66fad8..a795bd7499db8 100644 --- a/src/Symfony/Component/DependencyInjection/CHANGELOG.md +++ b/src/Symfony/Component/DependencyInjection/CHANGELOG.md @@ -1,6 +1,18 @@ CHANGELOG ========= +7.0 +--- + + * Remove `#[MapDecorated]`, use `#[AutowireDecorated]` instead + * Remove `ProxyHelper`, use `Symfony\Component\VarExporter\ProxyHelper` instead + * Remove `ReferenceSetArgumentTrait` + * Remove support of `@required` annotation, use the `Symfony\Contracts\Service\Attribute\Required` attribute instead + * Passing `null` to `ContainerAwareTrait::setContainer()` must be done explicitly + * Remove `PhpDumper` options `inline_factories_parameter` and `inline_class_loader_parameter`, use options `inline_factories` and `inline_class_loader` instead + * Parameter names of `ParameterBag` cannot be numerics + * Remove `ContainerAwareInterface` and `ContainerAwareTrait`, use dependency injection instead + 6.4 --- diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php index e28b60c6ead99..3e94ed1b2ca56 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowirePass.php @@ -15,7 +15,6 @@ use Symfony\Component\DependencyInjection\Attribute\Autowire; use Symfony\Component\DependencyInjection\Attribute\AutowireCallable; use Symfony\Component\DependencyInjection\Attribute\AutowireDecorated; -use Symfony\Component\DependencyInjection\Attribute\MapDecorated; use Symfony\Component\DependencyInjection\Attribute\Target; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -98,7 +97,7 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed return $this->processValue($this->container->getParameterBag()->resolveValue($value->value)); } - if ($value instanceof AutowireDecorated || $value instanceof MapDecorated) { + if ($value instanceof AutowireDecorated) { $definition = $this->container->getDefinition($this->currentId); return new Reference($definition->innerServiceId ?? $this->currentId.'.inner', $definition->decorationOnInvalid ?? ContainerInterface::NULL_ON_INVALID_REFERENCE); @@ -358,12 +357,6 @@ private function autowireMethod(\ReflectionFunctionAbstract $reflectionMethod, a continue 2; } - - foreach ($parameter->getAttributes(MapDecorated::class) as $attribute) { - $arguments[$index] = $this->processValue($attribute->newInstance()); - - continue 2; - } } if (!$type) { diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowireRequiredMethodsPass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowireRequiredMethodsPass.php index dcc04eabd3b0f..9c42280153489 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowireRequiredMethodsPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowireRequiredMethodsPass.php @@ -57,21 +57,6 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed } break; } - if (false !== $doc = $r->getDocComment()) { - if (false !== stripos($doc, '@required') && preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@required(?:\s|\*/$)#i', $doc)) { - trigger_deprecation('symfony/dependency-injection', '6.3', 'Relying on the "@required" annotation on method "%s::%s()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.', $reflectionMethod->class, $reflectionMethod->name); - - if ($this->isWither($reflectionMethod, $doc)) { - $withers[] = [$reflectionMethod->name, [], true]; - } else { - $value->addMethodCall($reflectionMethod->name, []); - } - break; - } - if (false === stripos($doc, '@inheritdoc') || !preg_match('#(?:^/\*\*|\n\s*+\*)\s*+(?:\{@inheritdoc\}|@inheritdoc)(?:\s|\*/$)#i', $doc)) { - break; - } - } try { $r = $r->getPrototype(); } catch (\ReflectionException) { diff --git a/src/Symfony/Component/DependencyInjection/Compiler/AutowireRequiredPropertiesPass.php b/src/Symfony/Component/DependencyInjection/Compiler/AutowireRequiredPropertiesPass.php index 5682110085ff8..c5f45da7e7abf 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/AutowireRequiredPropertiesPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/AutowireRequiredPropertiesPass.php @@ -42,15 +42,9 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed if (!($type = $reflectionProperty->getType()) instanceof \ReflectionNamedType) { continue; } - $doc = false; - if (!$reflectionProperty->getAttributes(Required::class) - && ((false === $doc = $reflectionProperty->getDocComment()) || false === stripos($doc, '@required') || !preg_match('#(?:^/\*\*|\n\s*+\*)\s*+@required(?:\s|\*/$)#i', $doc)) - ) { + if (!$reflectionProperty->getAttributes(Required::class)) { continue; } - if ($doc) { - trigger_deprecation('symfony/dependency-injection', '6.3', 'Using the "@required" annotation on property "%s::$%s" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.', $reflectionProperty->class, $reflectionProperty->name); - } if (\array_key_exists($name = $reflectionProperty->getName(), $properties)) { continue; } diff --git a/src/Symfony/Component/DependencyInjection/Compiler/ServiceLocatorTagPass.php b/src/Symfony/Component/DependencyInjection/Compiler/ServiceLocatorTagPass.php index fb0fc26829374..cf35855f9230e 100644 --- a/src/Symfony/Component/DependencyInjection/Compiler/ServiceLocatorTagPass.php +++ b/src/Symfony/Component/DependencyInjection/Compiler/ServiceLocatorTagPass.php @@ -64,28 +64,7 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed throw new InvalidArgumentException(sprintf('Invalid definition for service "%s": an array of references is expected as first argument when the "container.service_locator" tag is set.', $this->currentId)); } - $i = 0; - - foreach ($services as $k => $v) { - if ($v instanceof ServiceClosureArgument) { - continue; - } - - if ($i === $k) { - if ($v instanceof Reference) { - unset($services[$k]); - $k = (string) $v; - } - ++$i; - } elseif (\is_int($k)) { - $i = null; - } - - $services[$k] = new ServiceClosureArgument($v); - } - ksort($services); - - $value->setArgument(0, $services); + $value->setArgument(0, self::map($services)); $id = '.service_locator.'.ContainerBuilder::hash($value); @@ -104,12 +83,8 @@ protected function processValue(mixed $value, bool $isRoot = false): mixed public static function register(ContainerBuilder $container, array $map, string $callerId = null): Reference { - foreach ($map as $k => $v) { - $map[$k] = new ServiceClosureArgument($v); - } - $locator = (new Definition(ServiceLocator::class)) - ->addArgument($map) + ->addArgument(self::map($map)) ->addTag('container.service_locator'); if (null !== $callerId && $container->hasDefinition($callerId)) { @@ -134,4 +109,30 @@ public static function register(ContainerBuilder $container, array $map, string return new Reference($id); } + + public static function map(array $services): array + { + $i = 0; + + foreach ($services as $k => $v) { + if ($v instanceof ServiceClosureArgument) { + continue; + } + + if ($i === $k) { + if ($v instanceof Reference) { + unset($services[$k]); + $k = (string) $v; + } + ++$i; + } elseif (\is_int($k)) { + $i = null; + } + + $services[$k] = new ServiceClosureArgument($v); + } + ksort($services); + + return $services; + } } diff --git a/src/Symfony/Component/DependencyInjection/ContainerAwareInterface.php b/src/Symfony/Component/DependencyInjection/ContainerAwareInterface.php deleted file mode 100644 index 9b3709c965c16..0000000000000 --- a/src/Symfony/Component/DependencyInjection/ContainerAwareInterface.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -/** - * ContainerAwareInterface should be implemented by classes that depends on a Container. - * - * @author Fabien Potencier - * - * @deprecated since Symfony 6.4, use dependency injection instead - */ -interface ContainerAwareInterface -{ - /** - * Sets the container. - * - * @return void - */ - public function setContainer(?ContainerInterface $container); -} diff --git a/src/Symfony/Component/DependencyInjection/ContainerAwareTrait.php b/src/Symfony/Component/DependencyInjection/ContainerAwareTrait.php deleted file mode 100644 index 4174fec8d0eaf..0000000000000 --- a/src/Symfony/Component/DependencyInjection/ContainerAwareTrait.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection; - -trigger_deprecation('symfony/dependency-injection', '6.4', '"%s" is deprecated, use dependency injection instead.', ContainerAwareTrait::class); - -/** - * ContainerAware trait. - * - * @author Fabien Potencier - * - * @deprecated since Symfony 6.4, use dependency injection instead - */ -trait ContainerAwareTrait -{ - /** - * @var ContainerInterface - */ - protected $container; - - /** - * @return void - */ - public function setContainer(ContainerInterface $container = null) - { - if (1 > \func_num_args()) { - trigger_deprecation('symfony/dependency-injection', '6.2', 'Calling "%s::%s()" without any arguments is deprecated, pass null explicitly instead.', __CLASS__, __FUNCTION__); - } - - $this->container = $container; - } -} diff --git a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php index ac477728badad..033d85813d57e 100644 --- a/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php +++ b/src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php @@ -145,8 +145,6 @@ public function dump(array $options = []): string|array 'debug' => true, 'hot_path_tag' => 'container.hot_path', 'preload_tags' => ['container.preload', 'container.no_preload'], - 'inline_factories_parameter' => 'container.dumper.inline_factories', // @deprecated since Symfony 6.3 - 'inline_class_loader_parameter' => 'container.dumper.inline_class_loader', // @deprecated since Symfony 6.3 'inline_factories' => null, 'inline_class_loader' => null, 'preload_classes' => [], @@ -163,22 +161,11 @@ public function dump(array $options = []): string|array $this->inlineFactories = false; if (isset($options['inline_factories'])) { $this->inlineFactories = $this->asFiles && $options['inline_factories']; - } elseif (!$options['inline_factories_parameter']) { - trigger_deprecation('symfony/dependency-injection', '6.3', 'Option "inline_factories_parameter" passed to "%s()" is deprecated, use option "inline_factories" instead.', __METHOD__); - } elseif ($this->container->hasParameter($options['inline_factories_parameter'])) { - trigger_deprecation('symfony/dependency-injection', '6.3', 'Option "inline_factories_parameter" passed to "%s()" is deprecated, use option "inline_factories" instead.', __METHOD__); - $this->inlineFactories = $this->asFiles && $this->container->getParameter($options['inline_factories_parameter']); } $this->inlineRequires = $options['debug']; if (isset($options['inline_class_loader'])) { $this->inlineRequires = $options['inline_class_loader']; - } elseif (!$options['inline_class_loader_parameter']) { - trigger_deprecation('symfony/dependency-injection', '6.3', 'Option "inline_class_loader_parameter" passed to "%s()" is deprecated, use option "inline_class_loader" instead.', __METHOD__); - $this->inlineRequires = false; - } elseif ($this->container->hasParameter($options['inline_class_loader_parameter'])) { - trigger_deprecation('symfony/dependency-injection', '6.3', 'Option "inline_class_loader_parameter" passed to "%s()" is deprecated, use option "inline_class_loader" instead.', __METHOD__); - $this->inlineRequires = $this->container->getParameter($options['inline_class_loader_parameter']); } $this->serviceLocatorTag = $options['service_locator_tag']; diff --git a/src/Symfony/Component/DependencyInjection/LazyProxy/ProxyHelper.php b/src/Symfony/Component/DependencyInjection/LazyProxy/ProxyHelper.php deleted file mode 100644 index bde7d6a3fff58..0000000000000 --- a/src/Symfony/Component/DependencyInjection/LazyProxy/ProxyHelper.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\LazyProxy; - -trigger_deprecation('symfony/dependency-injection', '6.2', 'The "%s" class is deprecated, use "%s" instead.', ProxyHelper::class, \Symfony\Component\VarExporter\ProxyHelper::class); - -/** - * @author Nicolas Grekas - * - * @deprecated since Symfony 6.2, use VarExporter's ProxyHelper instead - */ -class ProxyHelper -{ - /** - * @return string|null The FQCN or builtin name of the type hint, or null when the type hint references an invalid self|parent context - */ - public static function getTypeHint(\ReflectionFunctionAbstract $r, \ReflectionParameter $p = null, bool $noBuiltin = false): ?string - { - if ($p instanceof \ReflectionParameter) { - $type = $p->getType(); - } else { - $type = $r->getReturnType(); - } - if (!$type) { - return null; - } - - return self::getTypeHintForType($type, $r, $noBuiltin); - } - - private static function getTypeHintForType(\ReflectionType $type, \ReflectionFunctionAbstract $r, bool $noBuiltin): ?string - { - $types = []; - $glue = '|'; - if ($type instanceof \ReflectionUnionType) { - $reflectionTypes = $type->getTypes(); - } elseif ($type instanceof \ReflectionIntersectionType) { - $reflectionTypes = $type->getTypes(); - $glue = '&'; - } elseif ($type instanceof \ReflectionNamedType) { - $reflectionTypes = [$type]; - } else { - return null; - } - - foreach ($reflectionTypes as $type) { - if ($type instanceof \ReflectionIntersectionType) { - $typeHint = self::getTypeHintForType($type, $r, $noBuiltin); - if (null === $typeHint) { - return null; - } - - $types[] = sprintf('(%s)', $typeHint); - - continue; - } - - if ($type->isBuiltin()) { - if (!$noBuiltin) { - $types[] = $type->getName(); - } - continue; - } - - $lcName = strtolower($type->getName()); - $prefix = $noBuiltin ? '' : '\\'; - - if ('self' !== $lcName && 'parent' !== $lcName) { - $types[] = $prefix.$type->getName(); - continue; - } - if (!$r instanceof \ReflectionMethod) { - continue; - } - if ('self' === $lcName) { - $types[] = $prefix.$r->getDeclaringClass()->name; - } else { - $types[] = ($parent = $r->getDeclaringClass()->getParentClass()) ? $prefix.$parent->name : null; - } - } - - sort($types); - - return $types ? implode($glue, $types) : null; - } -} diff --git a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php index 28f823746d998..20154ac7510a2 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php +++ b/src/Symfony/Component/DependencyInjection/Loader/Configurator/ContainerConfigurator.php @@ -125,10 +125,6 @@ function service_locator(array $values): ServiceLocatorArgument { $values = AbstractConfigurator::processValue($values, true); - if (isset($values[0])) { - trigger_deprecation('symfony/dependency-injection', '6.3', 'Using integers as keys in a "service_locator()" argument is deprecated. The keys will default to the IDs of the original services in 7.0.'); - } - return new ServiceLocatorArgument($values); } diff --git a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php index b6eb6732baa50..8203b75c46540 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php @@ -583,11 +583,6 @@ private function getArgumentsAsPhp(\DOMElement $node, string $name, string $file break; case 'service_locator': $arg = $this->getArgumentsAsPhp($arg, $name, $file); - - if (isset($arg[0])) { - trigger_deprecation('symfony/dependency-injection', '6.3', 'Skipping "key" argument or using integers as values in a "service_locator" tag is deprecated. The keys will default to the IDs of the original services in 7.0.'); - } - $arguments[$key] = new ServiceLocatorArgument($arg); break; case 'tagged': diff --git a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php index 822b45ef79b16..c7c18998f39a2 100644 --- a/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php +++ b/src/Symfony/Component/DependencyInjection/Loader/YamlFileLoader.php @@ -844,10 +844,6 @@ private function resolveServices(mixed $value, string $file, bool $isParameter = $argument = $this->resolveServices($argument, $file, $isParameter); - if (isset($argument[0])) { - trigger_deprecation('symfony/dependency-injection', '6.3', 'Using integers as keys in a "!service_locator" tag is deprecated. The keys will default to the IDs of the original services in 7.0.'); - } - return new ServiceLocatorArgument($argument); } if (\in_array($value->getTag(), ['tagged', 'tagged_iterator', 'tagged_locator'], true)) { diff --git a/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php b/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php index c1cd9087f0f85..40447dbbcbf2d 100644 --- a/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php +++ b/src/Symfony/Component/DependencyInjection/ParameterBag/ParameterBag.php @@ -11,6 +11,7 @@ namespace Symfony\Component\DependencyInjection\ParameterBag; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException; use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException; use Symfony\Component\DependencyInjection\Exception\RuntimeException; @@ -106,9 +107,7 @@ public function get(string $name): array|bool|string|int|float|\UnitEnum|null public function set(string $name, array|bool|string|int|float|\UnitEnum|null $value) { if (is_numeric($name)) { - trigger_deprecation('symfony/dependency-injection', '6.2', sprintf('Using numeric parameter name "%s" is deprecated and will throw as of 7.0.', $name)); - // uncomment the following line in 7.0 - // throw new InvalidArgumentException(sprintf('The parameter name "%s" cannot be numeric.', $name)); + throw new InvalidArgumentException(sprintf('The parameter name "%s" cannot be numeric.', $name)); } $this->parameters[$name] = $value; diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php index f08f1baea43fa..c2216f1ffe233 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowirePassTest.php @@ -15,7 +15,6 @@ use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; use Symfony\Bridge\PhpUnit\ClassExistsMock; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\Resource\ClassExistenceResource; use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; @@ -43,8 +42,6 @@ class AutowirePassTest extends TestCase { - use ExpectDeprecationTrait; - public static function setUpBeforeClass(): void { ClassExistsMock::register(AutowirePass::class); @@ -693,51 +690,6 @@ public function testOptionalArgsNoRequiredForCoreClasses() ); } - /** - * @group legacy - */ - public function testSetterInjectionAnnotation() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionAnnotation::setFoo()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionAnnotation::setChildMethodWithoutDocBlock()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionParentAnnotation::setDependencies()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - $container->register(Foo::class); - $container->register(A::class); - $container->register(CollisionA::class); - $container->register(CollisionB::class); - - // manually configure *one* call, to override autowiring - $container - ->register('setter_injection', SetterInjectionAnnotation::class) - ->setAutowired(true) - ->addMethodCall('setWithCallsConfigured', ['manual_arg1', 'manual_arg2']) - ; - - (new ResolveClassPass())->process($container); - (new AutowireRequiredMethodsPass())->process($container); - (new AutowirePass())->process($container); - - $methodCalls = $container->getDefinition('setter_injection')->getMethodCalls(); - - $this->assertEquals( - ['setWithCallsConfigured', 'setFoo', 'setChildMethodWithoutDocBlock', 'setDependencies'], - array_column($methodCalls, 0) - ); - - // test setWithCallsConfigured args - $this->assertEquals( - ['manual_arg1', 'manual_arg2'], - $methodCalls[0][1] - ); - // test setFoo args - $this->assertEquals( - [new TypedReference(Foo::class, Foo::class)], - $methodCalls[1][1] - ); - } - public function testSetterInjectionWithAttribute() { $container = new ContainerBuilder(); @@ -826,32 +778,6 @@ public function testIgnoreServiceWithClassNotExisting() $this->assertTrue($container->hasDefinition('bar')); } - /** - * @group legacy - */ - public function testSetterInjectionFromAnnotationCollisionThrowsException() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionCollisionAnnotation::setMultipleInstancesForOneArg()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - - $container->register('c1', CollisionA::class); - $container->register('c2', CollisionB::class); - $aDefinition = $container->register('setter_injection_collision', SetterInjectionCollisionAnnotation::class); - $aDefinition->setAutowired(true); - - (new AutowireRequiredMethodsPass())->process($container); - - $pass = new AutowirePass(); - - try { - $pass->process($container); - $this->fail('AutowirePass should have thrown an exception'); - } catch (AutowiringFailedException $e) { - $this->assertSame('Cannot autowire service "setter_injection_collision": argument "$collision" of method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionCollisionAnnotation::setMultipleInstancesForOneArg()" references interface "Symfony\Component\DependencyInjection\Tests\Compiler\CollisionInterface" but no such service exists. You should maybe alias this interface to one of these existing services: "c1", "c2".', (string) $e->getMessage()); - } - } - public function testSetterInjectionFromAttributeCollisionThrowsException() { $container = new ContainerBuilder(); @@ -1160,36 +1086,6 @@ public function testErroredServiceLocator() $this->assertSame(['Cannot autowire service "some_locator": it has type "Symfony\Component\DependencyInjection\Tests\Compiler\MissingClass" but this class was not found.'], $container->getDefinition('.errored.some_locator.'.MissingClass::class)->getErrors()); } - /** - * @group legacy - */ - public function testNamedArgumentAliasResolveCollisionsAnnotation() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionCollisionAnnotation::setMultipleInstancesForOneArg()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - - $container->register('c1', CollisionA::class); - $container->register('c2', CollisionB::class); - $container->setAlias(CollisionInterface::class.' $collision', 'c2'); - $aDefinition = $container->register('setter_injection_collision', SetterInjectionCollisionAnnotation::class); - $aDefinition->setAutowired(true); - - (new AutowireRequiredMethodsPass())->process($container); - - $pass = new AutowirePass(); - - $pass->process($container); - - $expected = [ - [ - 'setMultipleInstancesForOneArg', - [new TypedReference(CollisionInterface::class.' $collision', CollisionInterface::class)], - ], - ]; - $this->assertEquals($expected, $container->getDefinition('setter_injection_collision')->getMethodCalls()); - } - public function testNamedArgumentAliasResolveCollisions() { $container = new ContainerBuilder(); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowireRequiredMethodsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowireRequiredMethodsPassTest.php index 73f9f62bbad75..458786f137e97 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowireRequiredMethodsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowireRequiredMethodsPassTest.php @@ -12,59 +12,15 @@ namespace Symfony\Component\DependencyInjection\Tests\Compiler; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Component\DependencyInjection\Compiler\AutowireRequiredMethodsPass; use Symfony\Component\DependencyInjection\Compiler\ResolveClassPass; use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Tests\Fixtures\WitherAnnotationStaticReturnType; use Symfony\Component\DependencyInjection\Tests\Fixtures\WitherStaticReturnType; require_once __DIR__.'/../Fixtures/includes/autowiring_classes.php'; class AutowireRequiredMethodsPassTest extends TestCase { - use ExpectDeprecationTrait; - - /** - * @group legacy - */ - public function testSetterInjectionAnnotation() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionAnnotation::setFoo()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionAnnotation::setChildMethodWithoutDocBlock()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionParentAnnotation::setDependencies()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - $container->register(FooAnnotation::class); - $container->register(A::class); - $container->register(CollisionA::class); - $container->register(CollisionB::class); - - // manually configure *one* call, to override autowiring - $container - ->register('setter_injection', SetterInjectionAnnotation::class) - ->setAutowired(true) - ->addMethodCall('setWithCallsConfigured', ['manual_arg1', 'manual_arg2']); - - (new ResolveClassPass())->process($container); - (new AutowireRequiredMethodsPass())->process($container); - - $methodCalls = $container->getDefinition('setter_injection')->getMethodCalls(); - - $this->assertEquals( - ['setWithCallsConfigured', 'setFoo', 'setChildMethodWithoutDocBlock', 'setDependencies'], - array_column($methodCalls, 0) - ); - - // test setWithCallsConfigured args - $this->assertEquals( - ['manual_arg1', 'manual_arg2'], - $methodCalls[0][1] - ); - // test setFoo args - $this->assertEquals([], $methodCalls[1][1]); - } - public function testSetterInjectionWithAttribute() { $container = new ContainerBuilder(); @@ -81,40 +37,6 @@ public function testSetterInjectionWithAttribute() $this->assertSame([['setFoo', []]], $methodCalls); } - /** - * @group legacy - */ - // @deprecated since Symfony 6.3, to be removed in 7.0 - public function testExplicitMethodInjectionAnnotation() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionAnnotation::setFoo()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionAnnotation::setChildMethodWithoutDocBlock()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionParentAnnotation::setDependencies()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\SetterInjectionParentAnnotation::setWithCallsConfigured()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - $container->register(FooAnnotation::class); - $container->register(A::class); - $container->register(CollisionA::class); - $container->register(CollisionB::class); - - $container - ->register('setter_injection', SetterInjectionAnnotation::class) - ->setAutowired(true) - ->addMethodCall('notASetter', []); - - (new ResolveClassPass())->process($container); - (new AutowireRequiredMethodsPass())->process($container); - - $methodCalls = $container->getDefinition('setter_injection')->getMethodCalls(); - - $this->assertEquals( - ['notASetter', 'setFoo', 'setChildMethodWithoutDocBlock', 'setDependencies', 'setWithCallsConfigured'], - array_column($methodCalls, 0) - ); - $this->assertEquals([], $methodCalls[0][1]); - } - public function testExplicitMethodInjectionAttribute() { $container = new ContainerBuilder(); @@ -140,61 +62,6 @@ public function testExplicitMethodInjectionAttribute() $this->assertEquals([], $methodCalls[0][1]); } - /** - * @group legacy - */ - public function testWitherInjection() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\WitherAnnotation::withFoo1()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\WitherAnnotation::withFoo2()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - $container->register(FooAnnotation::class); - - $container - ->register('wither', WitherAnnotation::class) - ->setAutowired(true); - - (new ResolveClassPass())->process($container); - (new AutowireRequiredMethodsPass())->process($container); - - $methodCalls = $container->getDefinition('wither')->getMethodCalls(); - - $expected = [ - ['withFoo1', [], true], - ['withFoo2', [], true], - ['setFoo', []], - ]; - $this->assertSame($expected, $methodCalls); - } - - /** - * @group legacy - */ - public function testWitherAnnotationWithStaticReturnTypeInjection() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Fixtures\WitherAnnotationStaticReturnType::withFoo()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Fixtures\WitherAnnotationStaticReturnType::setFoo()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - $container->register(FooAnnotation::class); - - $container - ->register('wither', WitherAnnotationStaticReturnType::class) - ->setAutowired(true); - - (new ResolveClassPass())->process($container); - (new AutowireRequiredMethodsPass())->process($container); - - $methodCalls = $container->getDefinition('wither')->getMethodCalls(); - - $expected = [ - ['withFoo', [], true], - ['setFoo', []], - ]; - $this->assertSame($expected, $methodCalls); - } - public function testWitherWithStaticReturnTypeInjection() { $container = new ContainerBuilder(); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowireRequiredPropertiesPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowireRequiredPropertiesPassTest.php index 62e12f9e84cd8..902c1303d4cb3 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowireRequiredPropertiesPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/AutowireRequiredPropertiesPassTest.php @@ -12,40 +12,14 @@ namespace Symfony\Component\DependencyInjection\Tests\Compiler; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Component\DependencyInjection\Compiler\AutowireRequiredPropertiesPass; use Symfony\Component\DependencyInjection\Compiler\ResolveClassPass; use Symfony\Component\DependencyInjection\ContainerBuilder; require_once __DIR__.'/../Fixtures/includes/autowiring_classes.php'; -require_once __DIR__.'/../Fixtures/includes/autowiring_classes_74.php'; class AutowireRequiredPropertiesPassTest extends TestCase { - use ExpectDeprecationTrait; - - /** - * @group legacy - */ - public function testInjection() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Using the "@required" annotation on property "Symfony\Component\DependencyInjection\Tests\Compiler\PropertiesInjection::$plop" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - $container->register(Bar::class); - $container->register(A::class); - $container->register(B::class); - $container->register(PropertiesInjection::class)->setAutowired(true); - - (new ResolveClassPass())->process($container); - (new AutowireRequiredPropertiesPass())->process($container); - - $properties = $container->getDefinition(PropertiesInjection::class)->getProperties(); - - $this->assertArrayHasKey('plop', $properties); - $this->assertEquals(Bar::class, (string) $properties['plop']); - } - public function testAttribute() { $container = new ContainerBuilder(); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php index 3bf66f0313967..5d99f9385aa59 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/IntegrationTest.php @@ -588,7 +588,7 @@ public function testTaggedLocatorWithDefaultPriorityMethodConfiguredViaAttribute // We need to check priority of instances in the factories $factories = (new \ReflectionClass($locator))->getProperty('factories'); - self::assertSame([FooTagClass::class, BarTagClass::class], array_keys($factories->getValue($locator))); + self::assertSame([BarTagClass::class, FooTagClass::class], array_keys($factories->getValue($locator))); } public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMethodConfiguredViaAttribute() @@ -617,7 +617,7 @@ public function testTaggedLocatorWithDefaultIndexMethodAndWithDefaultPriorityMet // We need to check priority of instances in the factories $factories = (new \ReflectionClass($locator))->getProperty('factories'); - self::assertSame(['foo_tag_class', 'bar_tag_class'], array_keys($factories->getValue($locator))); + self::assertSame(['bar_tag_class', 'foo_tag_class'], array_keys($factories->getValue($locator))); self::assertSame($container->get(BarTagClass::class), $locator->get('bar_tag_class')); self::assertSame($container->get(FooTagClass::class), $locator->get('foo_tag_class')); } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/RegisterServiceSubscribersPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/RegisterServiceSubscribersPassTest.php index 45ff1b651a47b..b468189d0ad3d 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/RegisterServiceSubscribersPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/RegisterServiceSubscribersPassTest.php @@ -462,7 +462,7 @@ public static function getSubscribedServices(): array 'autowired' => new ServiceClosureArgument(new TypedReference('service.id', 'stdClass', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'autowired', [new Autowire(service: 'service.id')])), 'autowired.nullable' => new ServiceClosureArgument(new TypedReference('service.id', 'stdClass', ContainerInterface::IGNORE_ON_INVALID_REFERENCE, 'autowired.nullable', [new Autowire(service: 'service.id')])), 'autowired.parameter' => new ServiceClosureArgument('foobar'), - 'autowire.decorated' => new ServiceClosureArgument(new Reference('.service_locator.0tSxobl.inner', ContainerInterface::NULL_ON_INVALID_REFERENCE)), + 'autowire.decorated' => new ServiceClosureArgument(new Reference('.service_locator.oO4rxCy.inner', ContainerInterface::NULL_ON_INVALID_REFERENCE)), 'target' => new ServiceClosureArgument(new TypedReference('stdClass', 'stdClass', ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE, 'target', [new Target('someTarget')])), ]; $this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0)); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php index 449b60e5bccab..544322ba3348e 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveBindingsPassTest.php @@ -146,24 +146,6 @@ public function testTypedReferenceSupport() $this->assertEquals([new Reference('bar')], $container->getDefinition('def3')->getArguments()); } - /** - * @group legacy - */ - public function testScalarSetterAnnotation() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\ScalarSetterAnnotation::setDefaultLocale()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - - $definition = $container->autowire('foo', ScalarSetterAnnotation::class); - $definition->setBindings(['$defaultLocale' => 'fr']); - - (new AutowireRequiredMethodsPass())->process($container); - (new ResolveBindingsPass())->process($container); - - $this->assertEquals([['setDefaultLocale', ['fr']]], $definition->getMethodCalls()); - } - public function testScalarSetterAttribute() { $container = new ContainerBuilder(); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.php index 69370122a8d39..dd26ff8285ebd 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ResolveReferencesToAliasesPassTest.php @@ -86,6 +86,8 @@ public function testResolveFactory() } /** + * The test should be kept in the group as it always expects a deprecation. + * * @group legacy */ public function testDeprecationNoticeWhenReferencedByAlias() @@ -106,6 +108,8 @@ public function testDeprecationNoticeWhenReferencedByAlias() } /** + * The test should be kept in the group as it always expects a deprecation. + * * @group legacy */ public function testDeprecationNoticeWhenReferencedByDefinition() diff --git a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ServiceLocatorTagPassTest.php b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ServiceLocatorTagPassTest.php index 10f9bff443919..407c59c33c771 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Compiler/ServiceLocatorTagPassTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Compiler/ServiceLocatorTagPassTest.php @@ -206,13 +206,13 @@ public function testDefinitionOrderIsTheSame() $container->register('service-2'); $locator = ServiceLocatorTagPass::register($container, [ - 'service-2' => new Reference('service-2'), - 'service-1' => new Reference('service-1'), + new Reference('service-2'), + new Reference('service-1'), ]); $locator = $container->getDefinition($locator); $factories = $locator->getArguments()[0]; - static::assertSame(['service-2', 'service-1'], array_keys($factories)); + static::assertSame(['service-1', 'service-2'], array_keys($factories)); } public function testBindingsAreProcessed() diff --git a/src/Symfony/Component/DependencyInjection/Tests/ContainerAwareTraitTest.php b/src/Symfony/Component/DependencyInjection/Tests/ContainerAwareTraitTest.php deleted file mode 100644 index b2a3e72be65a6..0000000000000 --- a/src/Symfony/Component/DependencyInjection/Tests/ContainerAwareTraitTest.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Tests; - -use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; -use Symfony\Component\DependencyInjection\ContainerInterface; -use Symfony\Component\DependencyInjection\Tests\Fixtures\ContainerAwareDummy; - -/** - * @group legacy - */ -class ContainerAwareTraitTest extends TestCase -{ - use ExpectDeprecationTrait; - - public function testSetContainerLegacy() - { - $container = $this->createMock(ContainerInterface::class); - - $dummy = new ContainerAwareDummy(); - $dummy->setContainer($container); - - self::assertSame($container, $dummy->getContainer()); - - $this->expectDeprecation('Since symfony/dependency-injection 6.2: Calling "Symfony\Component\DependencyInjection\Tests\Fixtures\ContainerAwareDummy::setContainer()" without any arguments is deprecated, pass null explicitly instead.'); - - $dummy->setContainer(); - self::assertNull($dummy->getContainer()); - } - - public function testSetContainer() - { - $container = $this->createMock(ContainerInterface::class); - - $dummy = new ContainerAwareDummy(); - $dummy->setContainer($container); - - self::assertSame($container, $dummy->getContainer()); - - $dummy->setContainer(null); - self::assertNull($dummy->getContainer()); - } -} diff --git a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php index f0a3bc0ca2f71..2297cf3dd4346 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/ContainerBuilderTest.php @@ -48,7 +48,6 @@ use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\ServiceLocator; use Symfony\Component\DependencyInjection\Tests\Compiler\Foo; -use Symfony\Component\DependencyInjection\Tests\Compiler\FooAnnotation; use Symfony\Component\DependencyInjection\Tests\Compiler\SingleMethodInterface; use Symfony\Component\DependencyInjection\Tests\Compiler\Wither; use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass; @@ -57,7 +56,6 @@ use Symfony\Component\DependencyInjection\Tests\Fixtures\ScalarFactory; use Symfony\Component\DependencyInjection\Tests\Fixtures\SimilarArgumentsDummy; use Symfony\Component\DependencyInjection\Tests\Fixtures\StringBackedEnum; -use Symfony\Component\DependencyInjection\Tests\Fixtures\WitherAnnotationStaticReturnType; use Symfony\Component\DependencyInjection\Tests\Fixtures\WitherStaticReturnType; use Symfony\Component\DependencyInjection\TypedReference; use Symfony\Component\ExpressionLanguage\Expression; @@ -1855,28 +1853,6 @@ public function testLazyWither() $this->assertInstanceOf(Wither::class, $wither->withFoo1($wither->foo)); } - /** - * @group legacy - */ - public function testWitherAnnotationWithStaticReturnType() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Fixtures\WitherAnnotationStaticReturnType::withFoo()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Fixtures\WitherAnnotationStaticReturnType::setFoo()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - $container->register(FooAnnotation::class); - - $container - ->register('wither', WitherAnnotationStaticReturnType::class) - ->setPublic(true) - ->setAutowired(true); - - $container->compile(); - - $wither = $container->get('wither'); - $this->assertInstanceOf(FooAnnotation::class, $wither->foo); - } - public function testWitherWithStaticReturnType() { $container = new ContainerBuilder(); @@ -1912,6 +1888,8 @@ public function testAutoAliasing() } /** + * The test should be kept in the group as it always expects a deprecation. + * * @group legacy */ public function testDirectlyAccessingDeprecatedPublicService() diff --git a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php index 6d4ad0884441c..549c3d2c94f32 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Dumper/PhpDumperTest.php @@ -47,12 +47,10 @@ use Symfony\Component\DependencyInjection\Tests\Compiler\AAndIInterfaceConsumer; use Symfony\Component\DependencyInjection\Tests\Compiler\AInterface; use Symfony\Component\DependencyInjection\Tests\Compiler\Foo; -use Symfony\Component\DependencyInjection\Tests\Compiler\FooAnnotation; use Symfony\Component\DependencyInjection\Tests\Compiler\IInterface; use Symfony\Component\DependencyInjection\Tests\Compiler\MyCallable; use Symfony\Component\DependencyInjection\Tests\Compiler\SingleMethodInterface; use Symfony\Component\DependencyInjection\Tests\Compiler\Wither; -use Symfony\Component\DependencyInjection\Tests\Compiler\WitherAnnotation; use Symfony\Component\DependencyInjection\Tests\Fixtures\CustomDefinition; use Symfony\Component\DependencyInjection\Tests\Fixtures\FooClassWithEnumAttribute; use Symfony\Component\DependencyInjection\Tests\Fixtures\FooUnitEnum; @@ -1485,37 +1483,6 @@ public function testAliasCanBeFoundInTheDumpedContainerWhenBothTheAliasAndTheSer $this->assertContains('bar', $service_ids); } - /** - * @group legacy - */ - public function testWitherAnnotation() - { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\FooAnnotation::cloneFoo()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\WitherAnnotation::setFoo()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\WitherAnnotation::withFoo1()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Relying on the "@required" annotation on method "Symfony\Component\DependencyInjection\Tests\Compiler\WitherAnnotation::withFoo2()" is deprecated, use the "Symfony\Contracts\Service\Attribute\Required" attribute instead.'); - - $container = new ContainerBuilder(); - $container->register(FooAnnotation::class) - ->setAutowired(true); - - $container - ->register('wither', WitherAnnotation::class) - ->setPublic(true) - ->setAutowired(true); - - $container->compile(); - $dumper = new PhpDumper($container); - $dump = $dumper->dump(['class' => 'Symfony_DI_PhpDumper_Service_Wither_Annotation']); - $this->assertStringEqualsFile(self::$fixturesPath.'/php/services_wither_annotation.php', $dump); - eval('?>'.$dump); - - $container = new \Symfony_DI_PhpDumper_Service_Wither_Annotation(); - - $wither = $container->get('wither'); - $this->assertInstanceOf(FooAnnotation::class, $wither->foo); - } - public function testWitherAttribute() { $container = new ContainerBuilder(); @@ -1634,6 +1601,8 @@ public function testDumpServiceWithAbstractArgument() } /** + * The test should be kept in the group as it always expects a deprecation. + * * @group legacy */ public function testDirectlyAccessingDeprecatedPublicService() diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/ContainerAwareDummy.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/ContainerAwareDummy.php deleted file mode 100644 index 9c8eeeed4ad2a..0000000000000 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/ContainerAwareDummy.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\DependencyInjection\Tests\Fixtures; - -use Symfony\Component\DependencyInjection\ContainerAwareInterface; -use Symfony\Component\DependencyInjection\ContainerAwareTrait; -use Symfony\Component\DependencyInjection\ContainerInterface; - -/** - * @deprecated since Symfony 6.4, to be removed in 7.0 - */ -class ContainerAwareDummy implements ContainerAwareInterface -{ - use ContainerAwareTrait; - - public function getContainer(): ?ContainerInterface - { - return $this->container; - } -} - diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/WitherAnnotationStaticReturnType.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/WitherAnnotationStaticReturnType.php deleted file mode 100644 index 14b76d3b202f2..0000000000000 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/WitherAnnotationStaticReturnType.php +++ /dev/null @@ -1,34 +0,0 @@ -foo = $foo; - - return $new; - } - - /** - * @required - * - * @return $this - */ - public function setFoo(FooAnnotation $foo): static - { - $this->foo = $foo; - - return $this; - } -} diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/autowiring_classes.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/autowiring_classes.php index 7a93bfa8f7a79..26ed6e6895505 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/autowiring_classes.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/autowiring_classes.php @@ -11,18 +11,6 @@ require __DIR__.'/intersectiontype_classes.php'; require __DIR__.'/compositetype_classes.php'; -// @deprecated since Symfony 6.3, to be removed in 7.0 -class FooAnnotation -{ - /** - * @required - */ - public function cloneFoo(): static - { - return clone $this; - } -} - class Foo { public static int $counter = 0; @@ -239,20 +227,6 @@ public function __construct($foo, Bar $bar, $baz) } } -// @deprecated since Symfony 6.3, to be removed in 7.0 -class SetterInjectionCollisionAnnotation -{ - /** - * @required - */ - public function setMultipleInstancesForOneArg(CollisionInterface $collision) - { - // The CollisionInterface cannot be autowired - there are multiple - - // should throw an exception - } -} - class SetterInjectionCollision { #[Required] @@ -264,89 +238,6 @@ public function setMultipleInstancesForOneArg(CollisionInterface $collision) } } -// @deprecated since Symfony 6.3, to be removed in 7.0 -class SetterInjectionAnnotation extends SetterInjectionParentAnnotation -{ - - /** - * @required - */ - public function setFoo(Foo $foo) - { - // should be called - } - - public function notASetter(A $a) - { - // should be called only when explicitly specified - } - - /** - * @required*/ - public function setChildMethodWithoutDocBlock(A $a) - { - } -} - -// @deprecated since Symfony 6.3, to be removed in 7.0 -class SetterInjection extends SetterInjectionParent -{ - #[Required] - public function setFoo(Foo $foo) - { - // should be called - } - - /** @inheritdoc*/ // <- brackets are missing on purpose - public function setDependencies(Foo $foo, A $a) - { - // should be called - } - - /** {@inheritdoc} */ - public function setWithCallsConfigured(A $a) - { - // this method has a calls configured on it - } - - public function notASetter(A $a) - { - // should be called only when explicitly specified - } -} - -// @deprecated since Symfony 6.3, to be removed in 7.0 -class WitherAnnotation -{ - public $foo; - - /** - * @required - */ - public function setFoo(FooAnnotation $foo) - { - } - - /** - * @required - */ - public function withFoo1(FooAnnotation $foo): static - { - return $this->withFoo2($foo); - } - - /** - * @required - */ - public function withFoo2(FooAnnotation $foo): static - { - $new = clone $this; - $new->foo = $foo; - - return $new; - } -} - class Wither { public $foo; @@ -372,10 +263,9 @@ public function withFoo2(Foo $foo): static } } -// @deprecated since Symfony 6.3, to be removed in 7.0 -class SetterInjectionParentAnnotation +class SetterInjectionParent { - /** @required*/ + #[Required] public function setDependencies(Foo $foo, A $a) { // should be called @@ -383,41 +273,43 @@ public function setDependencies(Foo $foo, A $a) public function notASetter(A $a) { - // @required should be ignored when the child does not add @inheritdoc + // #[Required] should be ignored when the child does not also add #[Required] } - /** @required prefix is on purpose */ + #[Required] public function setWithCallsConfigured(A $a) { } - /** @required */ + #[Required] public function setChildMethodWithoutDocBlock(A $a) { } } -class SetterInjectionParent + +class SetterInjection extends SetterInjectionParent { #[Required] - public function setDependencies(Foo $foo, A $a) + public function setFoo(Foo $foo) { // should be called } - public function notASetter(A $a) + #[Required] + public function setDependencies(Foo $foo, A $a) { - // #[Required] should be ignored when the child does not add @inheritdoc + // should be called } - #[Required] public function setWithCallsConfigured(A $a) { + // this method has a calls configured on it } - #[Required] - public function setChildMethodWithoutDocBlock(A $a) + public function notASetter(A $a) { + // should be called only when explicitly specified } } @@ -464,17 +356,6 @@ private function __construct() } } -// @deprecated since Symfony 6.3, to be removed in 7.0 -class ScalarSetterAnnotation -{ - /** - * @required - */ - public function setDefaultLocale($defaultLocale) - { - } -} - class ScalarSetter { #[Required] diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/autowiring_classes_74.php b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/autowiring_classes_74.php deleted file mode 100644 index 8e354b28219a1..0000000000000 --- a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/includes/autowiring_classes_74.php +++ /dev/null @@ -1,21 +0,0 @@ - true, - '.service_locator.0H1ht0q.foo_service' => true, '.service_locator.2hyyc9y' => true, '.service_locator.KGUGnmw' => true, + '.service_locator.KGUGnmw.foo_service' => true, 'Symfony\\Component\\DependencyInjection\\Tests\\Fixtures\\CustomDefinition' => true, ]; } diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php index 7b24f5e2248e6..1dd57e0fde607 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/PhpFileLoaderTest.php @@ -14,7 +14,6 @@ require_once __DIR__.'/../Fixtures/includes/AcmeExtension.php'; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Component\Config\Builder\ConfigBuilderGenerator; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\Argument\ServiceLocatorArgument; @@ -29,8 +28,6 @@ class PhpFileLoaderTest extends TestCase { - use ExpectDeprecationTrait; - public function testSupports() { $loader = new PhpFileLoader(new ContainerBuilder(), new FileLocator()); @@ -212,13 +209,8 @@ public function testWhenEnv() $loader->load($fixtures.'/config/when_env.php'); } - /** - * @group legacy - */ public function testServiceWithServiceLocatorArgument() { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Using integers as keys in a "service_locator()" argument is deprecated. The keys will default to the IDs of the original services in 7.0.'); - $fixtures = realpath(__DIR__.'/../Fixtures'); $loader = new PhpFileLoader($container = new ContainerBuilder(), new FileLocator()); $loader->load($fixtures.'/config/services_with_service_locator_argument.php'); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php index a7c6df66fec3d..5538576281efc 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/XmlFileLoaderTest.php @@ -12,7 +12,6 @@ namespace Symfony\Component\DependencyInjection\Tests\Loader; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException; use Symfony\Component\Config\Exception\LoaderLoadException; use Symfony\Component\Config\FileLocator; @@ -49,8 +48,6 @@ class XmlFileLoaderTest extends TestCase { - use ExpectDeprecationTrait; - protected static $fixturesPath; public static function setUpBeforeClass(): void @@ -428,13 +425,8 @@ public function testParseTaggedArgumentsWithIndexBy() $this->assertEquals(new ServiceLocatorArgument($taggedIterator3), $container->getDefinition('foo3_tagged_locator')->getArgument(0)); } - /** - * @group legacy - */ public function testServiceWithServiceLocatorArgument() { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Skipping "key" argument or using integers as values in a "service_locator" tag is deprecated. The keys will default to the IDs of the original services in 7.0.'); - $container = new ContainerBuilder(); $loader = new XmlFileLoader($container, new FileLocator(self::$fixturesPath.'/xml')); $loader->load('services_with_service_locator_argument.xml'); diff --git a/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php b/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php index 7027cdb232e3c..5eeb09610feac 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/Loader/YamlFileLoaderTest.php @@ -12,7 +12,6 @@ namespace Symfony\Component\DependencyInjection\Tests\Loader; use PHPUnit\Framework\TestCase; -use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Component\Config\Exception\FileLocatorFileNotFoundException; use Symfony\Component\Config\Exception\LoaderLoadException; use Symfony\Component\Config\FileLocator; @@ -47,8 +46,6 @@ class YamlFileLoaderTest extends TestCase { - use ExpectDeprecationTrait; - protected static $fixturesPath; public static function setUpBeforeClass(): void @@ -422,13 +419,8 @@ public function testTaggedArgumentsWithIndex() $this->assertEquals(new ServiceLocatorArgument($taggedIterator), $container->getDefinition('bar_service_tagged_locator')->getArgument(0)); } - /** - * @group legacy - */ public function testServiceWithServiceLocatorArgument() { - $this->expectDeprecation('Since symfony/dependency-injection 6.3: Using integers as keys in a "!service_locator" tag is deprecated. The keys will default to the IDs of the original services in 7.0.'); - $container = new ContainerBuilder(); $loader = new YamlFileLoader($container, new FileLocator(self::$fixturesPath.'/yaml')); $loader->load('services_with_service_locator_argument.yml'); diff --git a/src/Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php b/src/Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php index 6cead157ca105..99c2f6a35a296 100644 --- a/src/Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php +++ b/src/Symfony/Component/DependencyInjection/Tests/ParameterBag/ParameterBagTest.php @@ -13,6 +13,7 @@ use PHPUnit\Framework\TestCase; use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException; use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException; use Symfony\Component\DependencyInjection\Exception\RuntimeException; @@ -82,32 +83,29 @@ public function testGetSet() } /** - * @group legacy - * Test it will throw in 7.0 + * @testWith [1001] + * [10.0] */ - public function testGetSetNumericName() + public function testSetNumericName(int|float $name) { - $bag = new ParameterBag(['foo']); - $bag->set(1001, 'foo'); - $this->assertEquals('foo', $bag->get(1001), '->set() sets the value of a new parameter'); - - $bag->set(10.0, 'foo'); - $this->assertEquals('foo', $bag->get(10), '->set() sets the value of a new parameter'); + $bag = new ParameterBag(); - $bag->set(0b0110, 'foo'); - $this->assertEquals('foo', $bag->get(0b0110), '->set() sets the value of a new parameter'); + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage(sprintf('The parameter name "%s" cannot be numeric.', $name)); - $bag->set('0', 'baz'); - $this->assertEquals('baz', $bag->get(0), '->set() overrides previously set parameter'); + $bag->set($name, 'foo'); + } - $this->assertTrue($bag->has(0)); - $this->assertTrue($bag->has(1001)); - $this->assertTrue($bag->has(10)); - $this->assertTrue($bag->has(0b0110)); + /** + * @testWith [1001] + * [10.0] + */ + public function testConstructorNumericName(int|float $name) + { + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage(sprintf('The parameter name "%s" cannot be numeric.', $name)); - foreach (array_keys($bag->all()) as $key) { - $this->assertIsInt($key, 'Numeric string keys are cast to integers'); - } + new ParameterBag([$name => 'foo']); } /** diff --git a/src/Symfony/Component/HttpKernel/Bundle/BundleInterface.php b/src/Symfony/Component/HttpKernel/Bundle/BundleInterface.php index fe200629f4478..400a9e0c929b5 100644 --- a/src/Symfony/Component/HttpKernel/Bundle/BundleInterface.php +++ b/src/Symfony/Component/HttpKernel/Bundle/BundleInterface.php @@ -11,7 +11,6 @@ namespace Symfony\Component\HttpKernel\Bundle; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Extension\ExtensionInterface; @@ -21,7 +20,7 @@ * * @author Fabien Potencier */ -interface BundleInterface extends ContainerAwareInterface +interface BundleInterface { /** * Boots the Bundle.