bug #25547 [DX][DependencyInjection] Suggest to write an implementation if the interface cannot be autowired (sroze)
This PR was merged into the 3.4 branch.
Discussion
----------
[DX][DependencyInjection] Suggest to write an implementation if the interface cannot be autowired
| Q | A
| ------------- | ---
| Branch? | 3.4
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | ø
| License | MIT
| Doc PR | ø
This would add a hint for the developers when the interface cannot be wired. This suggests creating the implementation of the interface.
**Note:** this is 3.4 because I believe DX should be treated as bugs.
**Note 2:** fabbot issue is false positive
Commits
-------
961e3e7
Suggest to write an implementation if the interface cannot be autowired
This commit is contained in:
commit
042247123e
@ -457,6 +457,10 @@ class AutowirePass extends AbstractRecursivePass
|
|||||||
} else {
|
} else {
|
||||||
$message = $this->container->has($type) ? 'this service is abstract' : 'no such service exists';
|
$message = $this->container->has($type) ? 'this service is abstract' : 'no such service exists';
|
||||||
$message = sprintf('references %s "%s" but %s.%s', $r->isInterface() ? 'interface' : 'class', $type, $message, $this->createTypeAlternatives($reference));
|
$message = sprintf('references %s "%s" but %s.%s', $r->isInterface() ? 'interface' : 'class', $type, $message, $this->createTypeAlternatives($reference));
|
||||||
|
|
||||||
|
if ($r->isInterface()) {
|
||||||
|
$message .= ' Did you create a class that implements this interface?';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$message = sprintf('Cannot autowire service "%s": %s %s', $this->currentId, $label, $message);
|
$message = sprintf('Cannot autowire service "%s": %s %s', $this->currentId, $label, $message);
|
||||||
|
@ -703,6 +703,23 @@ class AutowirePassTest extends TestCase
|
|||||||
$pass->process($container);
|
$pass->process($container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \Symfony\Component\DependencyInjection\Exception\AutowiringFailedException
|
||||||
|
* @expectedExceptionMessage Cannot autowire service "my_service": argument "$i" of method "Symfony\Component\DependencyInjection\Tests\Compiler\K::__construct()" references interface "Symfony\Component\DependencyInjection\Tests\Compiler\IInterface" but no such service exists. Did you create a class that implements this interface?
|
||||||
|
*/
|
||||||
|
public function testInterfaceWithNoImplementationSuggestToWriteOne()
|
||||||
|
{
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
|
||||||
|
$aDefinition = $container->register('my_service', K::class);
|
||||||
|
$aDefinition->setAutowired(true);
|
||||||
|
|
||||||
|
(new AutowireRequiredMethodsPass())->process($container);
|
||||||
|
|
||||||
|
$pass = new AutowirePass();
|
||||||
|
$pass->process($container);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @group legacy
|
* @group legacy
|
||||||
* @expectedDeprecation Autowiring services based on the types they implement is deprecated since Symfony 3.3 and won't be supported in version 4.0. You should rename (or alias) the "foo" service to "Symfony\Component\DependencyInjection\Tests\Compiler\Foo" instead.
|
* @expectedDeprecation Autowiring services based on the types they implement is deprecated since Symfony 3.3 and won't be supported in version 4.0. You should rename (or alias) the "foo" service to "Symfony\Component\DependencyInjection\Tests\Compiler\Foo" instead.
|
||||||
|
@ -90,6 +90,13 @@ class J
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class K
|
||||||
|
{
|
||||||
|
public function __construct(IInterface $i)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
interface CollisionInterface
|
interface CollisionInterface
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user