Skip to content

Commit

Permalink
[FrameworkBundle][Form] Better exception message for private form tag…
Browse files Browse the repository at this point in the history
…ged services
  • Loading branch information
ogizanagi committed Nov 2, 2015
1 parent 64917c7 commit 11d675f
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
Expand Up @@ -34,6 +34,10 @@ public function process(ContainerBuilder $container)
$types = array();

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));
}
// The following if-else block is deprecated and will be removed
// in Symfony 3.0
// Deprecation errors are triggered in the form registry
Expand All @@ -44,7 +48,6 @@ public function process(ContainerBuilder $container)
}

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

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

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));
}

if (isset($tag[0]['extended_type'])) {
$extendedType = $tag[0]['extended_type'];
} elseif (isset($tag[0]['alias'])) {
Expand All @@ -70,6 +78,12 @@ public function process(ContainerBuilder $container)

// Find all services annotated with "form.type_guesser"
$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));
}
}

$definition->replaceArgument(3, $guessers);
}
Expand Down
Expand Up @@ -206,6 +206,39 @@ public function testAddTaggedGuessers()
'my.guesser2',
), $extDefinition->getArgument(3));
}

/**
* @dataProvider privateTaggedServicesProvider
*/
public function testPrivateTaggedServices($id, $tagName, $expectedExceptionMessage)
{
$container = new ContainerBuilder();
$container->addCompilerPass(new FormPass());

$extDefinition = new Definition('Symfony\Component\Form\Extension\DependencyInjection\DependencyInjectionExtension');
$extDefinition->setArguments(array(
new Reference('service_container'),
array(),
array(),
array(),
));

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

$this->setExpectedException('\InvalidArgumentException', $expectedExceptionMessage);

$container->compile();
}

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'),
);
}
}

class FormPassTest_Type1 extends AbstractType
Expand Down

0 comments on commit 11d675f

Please sign in to comment.