[DependencyInjection] improved exception message
This commit is contained in:
parent
1ff2ab3dc1
commit
3647ccaeca
@ -29,10 +29,13 @@ class ResolveClassPass implements CompilerPassInterface
|
|||||||
if ($definition->isSynthetic() || null !== $definition->getClass()) {
|
if ($definition->isSynthetic() || null !== $definition->getClass()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (preg_match('/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)++$/', $id)) {
|
if (preg_match('/^\\\\?[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+(?:\\\\[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*+)++$/', $id)) {
|
||||||
if ($definition instanceof ChildDefinition && !class_exists($id)) {
|
if ($definition instanceof ChildDefinition && !class_exists($id)) {
|
||||||
throw new InvalidArgumentException(sprintf('Service definition "%s" has a parent but no class, and its name looks like a FQCN. Either the class is missing or you want to inherit it from the parent service. To resolve this ambiguity, please rename this service to a non-FQCN (e.g. using dots), or create the missing class.', $id));
|
throw new InvalidArgumentException(sprintf('Service definition "%s" has a parent but no class, and its name looks like a FQCN. Either the class is missing or you want to inherit it from the parent service. To resolve this ambiguity, please rename this service to a non-FQCN (e.g. using dots), or create the missing class.', $id));
|
||||||
}
|
}
|
||||||
|
if ('\\' === $id[0]) {
|
||||||
|
throw new InvalidArgumentException(sprintf('Service definition "%s" has no class, and its name looks like a FQCN but it starts with a backslash; remove the leading backslash.', $id));
|
||||||
|
}
|
||||||
$definition->setClass($id);
|
$definition->setClass($id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ use PHPUnit\Framework\TestCase;
|
|||||||
use Symfony\Component\DependencyInjection\ChildDefinition;
|
use Symfony\Component\DependencyInjection\ChildDefinition;
|
||||||
use Symfony\Component\DependencyInjection\Compiler\ResolveClassPass;
|
use Symfony\Component\DependencyInjection\Compiler\ResolveClassPass;
|
||||||
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
use Symfony\Component\DependencyInjection\ContainerBuilder;
|
||||||
|
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
|
||||||
use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass;
|
use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass;
|
||||||
|
|
||||||
class ResolveClassPassTest extends TestCase
|
class ResolveClassPassTest extends TestCase
|
||||||
@ -58,6 +59,17 @@ class ResolveClassPassTest extends TestCase
|
|||||||
yield ['\DateTime'];
|
yield ['\DateTime'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testWontResolveClassFromClassIdWithLeadingBackslash()
|
||||||
|
{
|
||||||
|
$this->expectException(InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessage('Service definition "\App\Some\Service" has no class, and its name looks like a FQCN but it starts with a backslash; remove the leading backslash.');
|
||||||
|
|
||||||
|
$container = new ContainerBuilder();
|
||||||
|
$container->register('\App\Some\Service');
|
||||||
|
|
||||||
|
(new ResolveClassPass())->process($container);
|
||||||
|
}
|
||||||
|
|
||||||
public function testNonFqcnChildDefinition()
|
public function testNonFqcnChildDefinition()
|
||||||
{
|
{
|
||||||
$container = new ContainerBuilder();
|
$container = new ContainerBuilder();
|
||||||
|
Reference in New Issue
Block a user