Skip to content

Commit

Permalink
feature #32390 [DependencyInjection] Deprecated passing Parameter ins…
Browse files Browse the repository at this point in the history
…tances as class name to Definition (derrabus)

This PR was merged into the 4.4 branch.

Discussion
----------

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

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | no
| New feature?  | no
| BC breaks?    | no
| Deprecations? | yes
| Tests pass?   | yes
| Fixed tickets | #32279
| License       | MIT
| Doc PR        | N/A

This PR deprecates the undocumented possibility to use a `Parameter` instance instead of a string as class name for a `Definition`. This was discovered while working on #32266.

Commits
-------

edfc9d6 Deprecated passing Parameter instances as class name to Definition.
  • Loading branch information
Tobion committed Jul 5, 2019
2 parents 09e3cef + edfc9d6 commit 43c14dd
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 4 deletions.
12 changes: 12 additions & 0 deletions UPGRADE-4.4.md
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
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
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
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
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
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

0 comments on commit 43c14dd

Please sign in to comment.