Deprecated passing Parameter instances as class name to Definition.

This commit is contained in:
Alexander M. Turek 2019-07-05 11:51:03 +02:00
parent 09e3cef7a0
commit edfc9d6f34
6 changed files with 57 additions and 4 deletions

View File

@ -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
----------

View File

@ -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
-----

View File

@ -171,6 +171,13 @@ class Definition
*/
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;

View File

@ -13,6 +13,7 @@ namespace Symfony\Component\DependencyInjection\Tests;
use PHPUnit\Framework\TestCase;
use Symfony\Component\DependencyInjection\Definition;
use Symfony\Component\DependencyInjection\Parameter;
use Symfony\Component\DependencyInjection\Reference;
class DefinitionTest extends TestCase
@ -27,6 +28,18 @@ class DefinitionTest extends TestCase
$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();
@ -49,6 +62,28 @@ class DefinitionTest extends TestCase
$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');

View File

@ -1082,7 +1082,7 @@ class PhpDumperTest extends TestCase
'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);

View File

@ -494,10 +494,8 @@ class MessengerPassTest extends TestCase
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);