use PHPUnit\Framework\TestCase;
use Psr\Container\ContainerInterface as PsrContainerInterface;
use Symfony\Component\Config\Resource\ComposerResource;
-use Symfony\Component\Config\Resource\ResourceInterface;
use Symfony\Component\Config\Resource\DirectoryResource;
+use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\Config\Resource\ResourceInterface;
use Symfony\Component\DependencyInjection\Alias;
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
-use Symfony\Component\DependencyInjection\Reference;
-use Symfony\Component\DependencyInjection\Tests\Fixtures\SimilarArgumentsDummy;
-use Symfony\Component\DependencyInjection\TypedReference;
-use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag;
-use Symfony\Component\Config\Resource\FileResource;
+use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
+use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ServiceLocator;
-use Symfony\Component\DependencyInjection\Tests\Fixtures\CustomDefinition;
use Symfony\Component\DependencyInjection\Tests\Fixtures\CaseSensitiveClass;
+use Symfony\Component\DependencyInjection\Tests\Fixtures\CustomDefinition;
+use Symfony\Component\DependencyInjection\Tests\Fixtures\SimilarArgumentsDummy;
+use Symfony\Component\DependencyInjection\TypedReference;
use Symfony\Component\ExpressionLanguage\Expression;
class ContainerBuilderTest extends TestCase
$builder->addCompilerPass($pass2 = $this->getMockBuilder('Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface')->getMock(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 10);
$passes = $builder->getCompiler()->getPassConfig()->getPasses();
- $this->assertCount(count($passes) - 2, $defaultPasses);
+ $this->assertCount(\count($passes) - 2, $defaultPasses);
// Pass 1 is executed later
$this->assertTrue(array_search($pass1, $passes, true) > array_search($pass2, $passes, true));
}
$foo1 = $builder->get('foo1');
$this->assertSame($foo1, $builder->get('foo1'), 'The same proxy is retrieved on multiple subsequent calls');
- $this->assertSame('Bar\FooClass', get_class($foo1));
+ $this->assertSame('Bar\FooClass', \get_class($foo1));
}
public function testCreateServiceClass()
$A = new ComposerResource();
$a = new FileResource(__DIR__.'/Fixtures/xml/services1.xml');
$b = new FileResource(__DIR__.'/Fixtures/xml/services2.xml');
- $c = new DirectoryResource($dir = dirname($b));
+ $c = new DirectoryResource($dir = \dirname($b));
$this->assertTrue($container->fileExists((string) $a) && $container->fileExists((string) $b) && $container->fileExists($dir));
$container->compile();
}
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
+ * @expectedExceptionMessage The definition for "\DateTime" has no class attribute, and appears to reference a class or interface in the global namespace.
+ */
+ public function testNoClassFromGlobalNamespaceClassIdWithLeadingSlash()
+ {
+ $container = new ContainerBuilder();
+
+ $container->register('\\'.\DateTime::class);
+ $container->compile();
+ }
+
+ /**
+ * @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
+ * @expectedExceptionMessage The definition for "\Symfony\Component\DependencyInjection\Tests\FooClass" has no class attribute, and appears to reference a class or interface. Please specify the class attribute explicitly or remove the leading backslash by renaming the service to "Symfony\Component\DependencyInjection\Tests\FooClass" to get rid of this error.
+ */
+ public function testNoClassFromNamespaceClassIdWithLeadingSlash()
+ {
+ $container = new ContainerBuilder();
+
+ $container->register('\\'.FooClass::class);
+ $container->compile();
+ }
+
/**
* @expectedException \Symfony\Component\DependencyInjection\Exception\RuntimeException
* @expectedExceptionMessage The definition for "123_abc" has no class.
$foo5 = $container->get('foo5');
$this->assertSame($foo5, $foo5->bar->foo);
+
+ $manager = $container->get('manager');
+ $this->assertEquals(new \stdClass(), $manager);
+
+ $manager = $container->get('manager2');
+ $this->assertEquals(new \stdClass(), $manager);
+
+ $foo6 = $container->get('foo6');
+ $this->assertEquals((object) array('bar6' => (object) array()), $foo6);
}
public function provideAlmostCircular()
$this->assertSame('via-argument', $container->get('foo')->class1->identifier);
$this->assertSame('via-bindings', $container->get('foo')->class2->identifier);
}
+
+ public function testUninitializedSyntheticReference()
+ {
+ $container = new ContainerBuilder();
+ $container->register('foo', 'stdClass')->setPublic(true)->setSynthetic(true);
+ $container->register('bar', 'stdClass')->setPublic(true)->setShared(false)
+ ->setProperty('foo', new Reference('foo', ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE));
+
+ $container->compile();
+
+ $this->assertEquals((object) array('foo' => null), $container->get('bar'));
+
+ $container->set('foo', (object) array(123));
+ $this->assertEquals((object) array('foo' => (object) array(123)), $container->get('bar'));
+ }
+
+ public function testDecoratedSelfReferenceInvolvingPrivateServices()
+ {
+ $container = new ContainerBuilder();
+ $container->register('foo', 'stdClass')
+ ->setPublic(false)
+ ->setProperty('bar', new Reference('foo'));
+ $container->register('baz', 'stdClass')
+ ->setPublic(false)
+ ->setProperty('inner', new Reference('baz.inner'))
+ ->setDecoratedService('foo');
+
+ $container->compile();
+
+ $this->assertSame(array('service_container'), array_keys($container->getDefinitions()));
+ }
}
class FooClass