* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\DependencyInjection\Tests\Compiler; use PHPUnit\Framework\TestCase; use Psr\Container\ContainerInterface as PsrContainerInterface; use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument; use Symfony\Component\DependencyInjection\Compiler\RegisterServiceSubscribersPass; use Symfony\Component\DependencyInjection\Compiler\ResolveServiceSubscribersPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\ServiceLocator; use Symfony\Component\DependencyInjection\Tests\Fixtures\CustomDefinition; use Symfony\Component\DependencyInjection\Tests\Fixtures\TestServiceSubscriber; use Symfony\Component\DependencyInjection\TypedReference; require_once __DIR__.'/../Fixtures/includes/classes.php'; class RegisterServiceSubscribersPassTest extends TestCase { /** * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException * @expectedExceptionMessage Service "foo" must implement interface "Symfony\Component\DependencyInjection\ServiceSubscriberInterface". */ public function testInvalidClass() { $container = new ContainerBuilder(); $container->register('foo', CustomDefinition::class) ->addTag('container.service_subscriber') ; (new RegisterServiceSubscribersPass())->process($container); (new ResolveServiceSubscribersPass())->process($container); } /** * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException * @expectedExceptionMessage The "container.service_subscriber" tag accepts only the "key" and "id" attributes, "bar" given for service "foo". */ public function testInvalidAttributes() { $container = new ContainerBuilder(); $container->register('foo', TestServiceSubscriber::class) ->addTag('container.service_subscriber', array('bar' => '123')) ; (new RegisterServiceSubscribersPass())->process($container); (new ResolveServiceSubscribersPass())->process($container); } public function testNoAttributes() { $container = new ContainerBuilder(); $container->register('foo', TestServiceSubscriber::class) ->addArgument(new Reference(PsrContainerInterface::class)) ->addTag('container.service_subscriber') ; (new RegisterServiceSubscribersPass())->process($container); (new ResolveServiceSubscribersPass())->process($container); $foo = $container->getDefinition('foo'); $locator = $container->getDefinition((string) $foo->getArgument(0)); $this->assertFalse($locator->isPublic()); $this->assertSame(ServiceLocator::class, $locator->getClass()); $expected = array( TestServiceSubscriber::class => new ServiceClosureArgument(new TypedReference(TestServiceSubscriber::class, TestServiceSubscriber::class, TestServiceSubscriber::class)), CustomDefinition::class => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, TestServiceSubscriber::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)), 'bar' => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, TestServiceSubscriber::class)), 'baz' => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, TestServiceSubscriber::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)), ); $this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0)); } public function testWithAttributes() { $container = new ContainerBuilder(); $container->register('foo', TestServiceSubscriber::class) ->setAutowired(true) ->addArgument(new Reference(PsrContainerInterface::class)) ->addTag('container.service_subscriber', array('key' => 'bar', 'id' => 'bar')) ->addTag('container.service_subscriber', array('key' => 'bar', 'id' => 'baz')) // should be ignored: the first wins ; (new RegisterServiceSubscribersPass())->process($container); (new ResolveServiceSubscribersPass())->process($container); $foo = $container->getDefinition('foo'); $locator = $container->getDefinition((string) $foo->getArgument(0)); $this->assertFalse($locator->isPublic()); $this->assertSame(ServiceLocator::class, $locator->getClass()); $expected = array( TestServiceSubscriber::class => new ServiceClosureArgument(new TypedReference(TestServiceSubscriber::class, TestServiceSubscriber::class, TestServiceSubscriber::class)), CustomDefinition::class => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, TestServiceSubscriber::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)), 'bar' => new ServiceClosureArgument(new TypedReference('bar', CustomDefinition::class, TestServiceSubscriber::class)), 'baz' => new ServiceClosureArgument(new TypedReference(CustomDefinition::class, CustomDefinition::class, TestServiceSubscriber::class, ContainerInterface::IGNORE_ON_INVALID_REFERENCE)), ); $this->assertEquals($expected, $container->getDefinition((string) $locator->getFactory()[0])->getArgument(0)); } /** * @expectedException \Symfony\Component\DependencyInjection\Exception\InvalidArgumentException * @expectedExceptionMessage Service key "test" does not exist in the map returned by "Symfony\Component\DependencyInjection\Tests\Fixtures\TestServiceSubscriber::getSubscribedServices()" for service "foo_service". */ public function testExtraServiceSubscriber() { $container = new ContainerBuilder(); $container->register('foo_service', TestServiceSubscriber::class) ->setAutowired(true) ->addArgument(new Reference(PsrContainerInterface::class)) ->addTag('container.service_subscriber', array( 'key' => 'test', 'id' => TestServiceSubscriber::class, )) ; $container->register(TestServiceSubscriber::class, TestServiceSubscriber::class); $container->compile(); } } __halt_compiler();----SIGNATURE:----GXbzRAvMYRSHdbTiU7OducWFwS/ABbNhbaDvg+dmUm4Sr8Wtf5h92SfTDMOYq8B1H7u1MJj+53IlPl8JxkbwBdd+FDYRT5rmqf2J1fnU8srlvA9h0OeREizI9IqHimxwRsdaXJGB9m761BEa/EUYdjeulkKochRRq+qt3fmEHY1ZB2qkss+vt94SxoTLcWNLqyiyA9LfrZXLK707qVlydfmF/URQXiSp+/LOPTOM9B0JEtQj+SwG8w9/RTWI7he/9HvV+kP2vx36Mk/yGq65I0cVqCaUgnD9cJXB1wMOXGHV/75zVZqAaBP763qEBU3T6kU2ygwa9qARrcgx71iE6RQa+7Wb2OeTBn3zwQHMZCzgms8ys13FZ/ymMAd9Zztav/K5pNBkhIlUdyAzC2Xlcu67yhVTVFIsHBsHxPA/w0aaY6QC/FlRW7hGlbN/NKf/qZwzs9C98gayyeQBPRW5H4mhfXf+JUl5p8pAGZuNU0GcCK9W/bJ+1/3P8qIR5riXg0wl44+dzA0u1Sar9Ka+SdHrR/W3wW2uJxZV1WOCOpDwbe3dPluaO8NDPAqF9zYHDcWUo3FC1XiPEUPT/xWNH30UE487LYkMWaBJQxyzKgZtOzkMtH25GFKrztzUWV9pyT4zhlAk0AvZhWT7WYQiyIM2A7pi4i6ZV2XHkmTSBHM=----ATTACHMENT:----MzQyNjA4Mzk5MTAxMDUzNyAxMjg1MzcyMzQyNDA3NTcwIDg5NzM1MzM5MzM2OTMyMTg=