Skip to content

[DependencyInjection] Deprecated passing Parameter instances as class name to Definition #32390

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions UPGRADE-4.4.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,18 @@ DependencyInjection
arguments: [!tagged_iterator app.handler]
```

* Passing an instance of `Symfony\Component\DependencyInjection\Parameter` as class name to `Symfony\Component\DependencyInjection\Definition` is deprecated.

Before:
```php
new Definition(new Parameter('my_class'));
```

After:
```php
new Definition('%my_class%');
```

Filesystem
----------

Expand Down
1 change: 1 addition & 0 deletions src/Symfony/Component/DependencyInjection/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ CHANGELOG

* deprecated support for short factories and short configurators in Yaml
* deprecated `tagged` in favor of `tagged_iterator`
* deprecated passing an instance of `Symfony\Component\DependencyInjection\Parameter` as class name to `Symfony\Component\DependencyInjection\Definition`

4.3.0
-----
Expand Down
7 changes: 7 additions & 0 deletions src/Symfony/Component/DependencyInjection/Definition.php
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,13 @@ public function getDecoratedService()
*/
public function setClass($class)
{
if ($class instanceof Parameter) {
@trigger_error(sprintf('Passing an instance of %s as class name to %s in deprecated in Symfony 4.4 and will result in a TypeError in 5.0. Please pass the string "%%%s%%" instead.', Parameter::class, __CLASS__, (string) $class), E_USER_DEPRECATED);
}
if (null !== $class && !\is_string($class)) {
@trigger_error(sprintf('The class name passed to %s is expected to be a string. Passing a %s is deprecated in Symfony 4.4 and will result in a TypeError in 5.0.', __CLASS__, \is_object($class) ? \get_class($class) : \gettype($class)), E_USER_DEPRECATED);
}

$this->changes['class'] = true;

$this->class = $class;
Expand Down
35 changes: 35 additions & 0 deletions src/Symfony/Component/DependencyInjection/Tests/DefinitionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\Reference;

class DefinitionTest extends TestCase
Expand All @@ -27,6 +28,18 @@ public function testConstructor()
$this->assertEquals(['foo'], $def->getArguments(), '__construct() takes an optional array of arguments as its second argument');
}

/**
* @group legacy
* @expectedDeprecation Passing an instance of Symfony\Component\DependencyInjection\Parameter as class name to Symfony\Component\DependencyInjection\Definition in deprecated in Symfony 4.4 and will result in a TypeError in 5.0. Please pass the string "%parameter%" instead.
*/
public function testConstructorWithParameter()
{
$parameter = new Parameter('parameter');

$def = new Definition($parameter);
$this->assertSame($parameter, $def->getClass(), '__construct() accepts Parameter instances');
}

public function testSetGetFactory()
{
$def = new Definition();
Expand All @@ -49,6 +62,28 @@ public function testSetGetClass()
$this->assertEquals('foo', $def->getClass(), '->getClass() returns the class name');
}

/**
* @group legacy
* @expectedDeprecation Passing an instance of Symfony\Component\DependencyInjection\Parameter as class name to Symfony\Component\DependencyInjection\Definition in deprecated in Symfony 4.4 and will result in a TypeError in 5.0. Please pass the string "%parameter%" instead.
*/
public function testSetGetClassWithParameter()
{
$def = new Definition();
$parameter = new Parameter('parameter');
$this->assertSame($parameter, $def->setClass($parameter)->getClass(), '->getClass() returns the parameterized class name');
}

/**
* @group legacy
* @expectedDeprecation The class name passed to Symfony\Component\DependencyInjection\Definition is expected to be a string. Passing a stdClass is deprecated in Symfony 4.4 and will result in a TypeError in 5.0.
*/
public function testSetGetClassWithObject()
{
$def = new Definition();
$classObject = new \stdClass();
$this->assertSame($classObject, $def->setClass($classObject)->getClass(), '->getClass() returns the parameterized class name');
}

public function testSetGetDecoratedService()
{
$def = new Definition('stdClass');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1082,7 +1082,7 @@ public function testDumpHandlesObjectClassNames()
'class' => 'stdClass',
]));

$container->setDefinition('foo', new Definition(new Parameter('class')));
$container->setDefinition('foo', new Definition('%class%'));
$container->setDefinition('bar', new Definition('stdClass', [
new Reference('foo'),
]))->setPublic(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -494,10 +494,8 @@ public function testNeedsToHandleAtLeastOneMessage()

public function testRegistersTraceableBusesToCollector()
{
$dataCollector = $this->getMockBuilder(MessengerDataCollector::class)->getMock();

$container = $this->getContainerBuilder($fooBusId = 'messenger.bus.foo');
$container->register('data_collector.messenger', $dataCollector);
$container->register('data_collector.messenger', MessengerDataCollector::class);
$container->setParameter('kernel.debug', true);

(new MessengerPass())->process($container);
Expand Down