Skip to content

Allow to use all tags with private services #18116

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,7 @@ public function process(ContainerBuilder $container)

foreach ($container->findTaggedServiceIds('form.type') as $serviceId => $tag) {
$serviceDefinition = $container->getDefinition($serviceId);
if (!$serviceDefinition->isPublic()) {
throw new \InvalidArgumentException(sprintf('The service "%s" must be public as form types are lazy-loaded.', $serviceId));
}
$serviceDefinition->setPublic(true);

// Support type access by FQCN
$types[$serviceDefinition->getClass()] = $serviceId;
Expand All @@ -49,9 +47,7 @@ public function process(ContainerBuilder $container)

foreach ($container->findTaggedServiceIds('form.type_extension') as $serviceId => $tag) {
$serviceDefinition = $container->getDefinition($serviceId);
if (!$serviceDefinition->isPublic()) {
throw new \InvalidArgumentException(sprintf('The service "%s" must be public as form type extensions are lazy-loaded.', $serviceId));
}
$serviceDefinition->setPublic(true);

if (isset($tag[0]['extended_type'])) {
$extendedType = $tag[0]['extended_type'];
Expand All @@ -68,9 +64,7 @@ public function process(ContainerBuilder $container)
$guessers = array_keys($container->findTaggedServiceIds('form.type_guesser'));
foreach ($guessers as $serviceId) {
$serviceDefinition = $container->getDefinition($serviceId);
if (!$serviceDefinition->isPublic()) {
throw new \InvalidArgumentException(sprintf('The service "%s" must be public as form type guessers are lazy-loaded.', $serviceId));
}
$serviceDefinition->setPublic(true);
}

$definition->replaceArgument(3, $guessers);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ public function testAddTaggedGuessers()
/**
* @dataProvider privateTaggedServicesProvider
*/
public function testPrivateTaggedServices($id, $tagName, $expectedExceptionMessage)
public function testPrivateTaggedServices($id, $tagName, $argument, $expectedArguments)
{
$container = new ContainerBuilder();
$container->addCompilerPass(new FormPass());
Expand All @@ -166,19 +166,22 @@ public function testPrivateTaggedServices($id, $tagName, $expectedExceptionMessa
));

$container->setDefinition('form.extension', $extDefinition);
$container->register($id, 'stdClass')->setPublic(false)->addTag($tagName);

$this->setExpectedException('\InvalidArgumentException', $expectedExceptionMessage);
$extension = $container->register($id, 'stdClass')->setPublic(false)->addTag($tagName, array('extended_type' => 'stdClass'));

$container->compile();

$extDefinition = $container->getDefinition('form.extension');

$this->assertSame($expectedArguments, $extDefinition->getArgument($argument));
$this->assertTrue($extension->isPublic());
}

public function privateTaggedServicesProvider()
{
return array(
array('my.type', 'form.type', 'The service "my.type" must be public as form types are lazy-loaded'),
array('my.type_extension', 'form.type_extension', 'The service "my.type_extension" must be public as form type extensions are lazy-loaded'),
array('my.guesser', 'form.type_guesser', 'The service "my.guesser" must be public as form type guessers are lazy-loaded'),
array('my.type', 'form.type', 1, array('stdClass' => 'my.type')),
array('my.type_extension', 'form.type_extension', 2, array('stdClass' => array('my.type_extension'))),
array('my.guesser', 'form.type_guesser', 3, array('my.guesser')),
);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,7 @@ public function process(ContainerBuilder $container)

foreach ($container->findTaggedServiceIds($this->listenerTag) as $id => $events) {
$def = $container->getDefinition($id);
if (!$def->isPublic()) {
throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event listeners are lazy-loaded.', $id));
}
$def->setPublic(true);

if ($def->isAbstract()) {
throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event listeners are lazy-loaded.', $id));
Expand All @@ -87,9 +85,7 @@ public function process(ContainerBuilder $container)

foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) {
$def = $container->getDefinition($id);
if (!$def->isPublic()) {
throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event subscribers are lazy-loaded.', $id));
}
$def->setPublic(true);

if ($def->isAbstract()) {
throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event subscribers are lazy-loaded.', $id));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ public function testEventSubscriberWithoutInterface()

$definition = $this->getMock('Symfony\Component\DependencyInjection\Definition');
$definition->expects($this->atLeastOnce())
->method('isPublic')
->will($this->returnValue(true));
->method('setPublic')
->with(true);
$definition->expects($this->atLeastOnce())
->method('getClass')
->will($this->returnValue('stdClass'));
Expand Down Expand Up @@ -66,8 +66,8 @@ public function testValidEventSubscriber()

$definition = $this->getMock('Symfony\Component\DependencyInjection\Definition');
$definition->expects($this->atLeastOnce())
->method('isPublic')
->will($this->returnValue(true));
->method('setPublic')
->with(true);
$definition->expects($this->atLeastOnce())
->method('getClass')
->will($this->returnValue('Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService'));
Expand Down Expand Up @@ -98,31 +98,34 @@ public function testValidEventSubscriber()
}

/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage The service "foo" must be public as event listeners are lazy-loaded.
* @dataProvider privateTaggedServicesProvider
*/
public function testPrivateEventListener()
public function testPrivateEventListenerAndSubscriber($tag, array $tagAttributes, array $methodCalls)
{
$container = new ContainerBuilder();
$container->register('foo', 'stdClass')->setPublic(false)->addTag('kernel.event_listener', array());
$container->register('event_dispatcher', 'stdClass');
$listener = $container
->register('foo', SubscriberService::class)
->setPublic(false)
->addTag($tag, $tagAttributes);
$eventDispatcher = $container->register('event_dispatcher', 'stdClass');

$registerListenersPass = new RegisterListenersPass();
$registerListenersPass->process($container);

$this->assertSame($methodCalls, $eventDispatcher->getMethodCalls());
$this->assertTrue($listener->isPublic());
}

/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage The service "foo" must be public as event subscribers are lazy-loaded.
*/
public function testPrivateEventSubscriber()
public function privateTaggedServicesProvider()
{
$container = new ContainerBuilder();
$container->register('foo', 'stdClass')->setPublic(false)->addTag('kernel.event_subscriber', array());
$container->register('event_dispatcher', 'stdClass');

$registerListenersPass = new RegisterListenersPass();
$registerListenersPass->process($container);
return array(
array('kernel.event_subscriber', array(), array(
array('addSubscriberService', array('foo', SubscriberService::class)),
)),
array('kernel.event_listener', array('event' => 'foo_bar'), array(
array('addListenerService', array('foo_bar', array('foo', 'onFoobar'), 0)),
)),
);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,7 @@ public function process(ContainerBuilder $container)
$definition = $container->getDefinition($this->handlerService);
foreach ($container->findTaggedServiceIds($this->rendererTag) as $id => $tags) {
$def = $container->getDefinition($id);
if (!$def->isPublic()) {
throw new \InvalidArgumentException(sprintf('The service "%s" must be public as fragment renderer are lazy-loaded.', $id));
}
$def->setPublic(true);

if ($def->isAbstract()) {
throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as fragment renderer are lazy-loaded.', $id));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public function testValidContentRenderer()
->will($this->returnValue('Symfony\Component\HttpKernel\Tests\DependencyInjection\RendererService'));
$definition
->expects($this->once())
->method('isPublic')
->method('setPublic')
->will($this->returnValue(true))
;

Expand Down