Skip to content

Commit 225d24a

Browse files
committed
[FrameworkBundle][Form] Better exception message for private form tagged services
1 parent 90bb56a commit 225d24a

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

DependencyInjection/Compiler/FormPass.php

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ public function process(ContainerBuilder $container)
3434
$types = array();
3535

3636
foreach ($container->findTaggedServiceIds('form.type') as $serviceId => $tag) {
37+
$serviceDefinition = $container->getDefinition($serviceId);
38+
if (!$serviceDefinition->isPublic()) {
39+
throw new \InvalidArgumentException(sprintf('The service "%s" must be public as form types are lazy-loaded.', $serviceId));
40+
}
3741
// The following if-else block is deprecated and will be removed
3842
// in Symfony 3.0
3943
// Deprecation errors are triggered in the form registry
@@ -44,7 +48,6 @@ public function process(ContainerBuilder $container)
4448
}
4549

4650
// Support type access by FQCN
47-
$serviceDefinition = $container->getDefinition($serviceId);
4851
$types[$serviceDefinition->getClass()] = $serviceId;
4952
}
5053

@@ -53,6 +56,11 @@ public function process(ContainerBuilder $container)
5356
$typeExtensions = array();
5457

5558
foreach ($container->findTaggedServiceIds('form.type_extension') as $serviceId => $tag) {
59+
$serviceDefinition = $container->getDefinition($serviceId);
60+
if (!$serviceDefinition->isPublic()) {
61+
throw new \InvalidArgumentException(sprintf('The service "%s" must be public as form type extensions are lazy-loaded.', $serviceId));
62+
}
63+
5664
if (isset($tag[0]['extended_type'])) {
5765
$extendedType = $tag[0]['extended_type'];
5866
} elseif (isset($tag[0]['alias'])) {
@@ -70,6 +78,12 @@ public function process(ContainerBuilder $container)
7078

7179
// Find all services annotated with "form.type_guesser"
7280
$guessers = array_keys($container->findTaggedServiceIds('form.type_guesser'));
81+
foreach ($guessers as $serviceId) {
82+
$serviceDefinition = $container->getDefinition($serviceId);
83+
if (!$serviceDefinition->isPublic()) {
84+
throw new \InvalidArgumentException(sprintf('The service "%s" must be public as form type guessers are lazy-loaded.', $serviceId));
85+
}
86+
}
7387

7488
$definition->replaceArgument(3, $guessers);
7589
}

Tests/DependencyInjection/Compiler/FormPassTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,39 @@ public function testAddTaggedGuessers()
206206
'my.guesser2',
207207
), $extDefinition->getArgument(3));
208208
}
209+
210+
/**
211+
* @dataProvider privateTaggedServicesProvider
212+
*/
213+
public function testPrivateTaggedServices($id, $tagName, $expectedExceptionMessage)
214+
{
215+
$container = new ContainerBuilder();
216+
$container->addCompilerPass(new FormPass());
217+
218+
$extDefinition = new Definition('Symfony\Component\Form\Extension\DependencyInjection\DependencyInjectionExtension');
219+
$extDefinition->setArguments(array(
220+
new Reference('service_container'),
221+
array(),
222+
array(),
223+
array(),
224+
));
225+
226+
$container->setDefinition('form.extension', $extDefinition);
227+
$container->register($id, 'stdClass')->setPublic(false)->addTag($tagName);
228+
229+
$this->setExpectedException('\InvalidArgumentException', $expectedExceptionMessage);
230+
231+
$container->compile();
232+
}
233+
234+
public function privateTaggedServicesProvider()
235+
{
236+
return array(
237+
array('my.type', 'form.type', 'The service "my.type" must be public as form types are lazy-loaded'),
238+
array('my.type_extension', 'form.type_extension', 'The service "my.type_extension" must be public as form type extensions are lazy-loaded'),
239+
array('my.guesser', 'form.type_guesser', 'The service "my.guesser" must be public as form type guessers are lazy-loaded'),
240+
);
241+
}
209242
}
210243

211244
class FormPassTest_Type1 extends AbstractType

0 commit comments

Comments
 (0)