bug #30979 Fix the configurability of CoreExtension deps in standalone usage (stof)

This PR was squashed before being merged into the 3.4 branch (closes #30979).

Discussion
----------

Fix the configurability of CoreExtension deps in standalone usage

| Q             | A
| ------------- | ---
| Branch?       | 3.4
| Bug fix?      | yes
| New feature?  | no
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | not yet, but will allow fixing them
| Fixed tickets | n/a
| License       | MIT
| Doc PR        | n/a

When using the Forms entrypoint to configure the component, there was no chance to configure dependencies of the CoreExtension, as the one registered without argument was first and would win.
The builder now delays the prepending of the CoreExtension to do it only if the CoreExtension is not registered explicitly.

We discovered that when trying to fix tests for the FileType, where we wanted to pass a Translator to it.

Commits
-------

934118b131 Fix the configurability of CoreExtension deps in standalone usage
This commit is contained in:
Nicolas Grekas 2019-04-07 15:12:19 +02:00
commit d8b03ee437
3 changed files with 29 additions and 7 deletions

View File

@ -69,7 +69,7 @@ class CoreExtension extends AbstractExtension
new Type\TimeType(),
new Type\TimezoneType(),
new Type\UrlType(),
new Type\FileType(),
new Type\FileType($this->translator),
new Type\ButtonType(),
new Type\SubmitType(),
new Type\ResetType(),

View File

@ -11,6 +11,8 @@
namespace Symfony\Component\Form;
use Symfony\Component\Form\Extension\Core\CoreExtension;
/**
* The default implementation of FormFactoryBuilderInterface.
*
@ -18,6 +20,8 @@ namespace Symfony\Component\Form;
*/
class FormFactoryBuilder implements FormFactoryBuilderInterface
{
private $forceCoreExtension;
/**
* @var ResolvedFormTypeFactoryInterface
*/
@ -43,6 +47,14 @@ class FormFactoryBuilder implements FormFactoryBuilderInterface
*/
private $typeGuessers = [];
/**
* @param bool $forceCoreExtension
*/
public function __construct($forceCoreExtension = false)
{
$this->forceCoreExtension = $forceCoreExtension;
}
/**
* {@inheritdoc}
*/
@ -144,6 +156,21 @@ class FormFactoryBuilder implements FormFactoryBuilderInterface
{
$extensions = $this->extensions;
if ($this->forceCoreExtension) {
$hasCoreExtension = false;
foreach ($extensions as $extension) {
if ($extension instanceof CoreExtension) {
$hasCoreExtension = true;
break;
}
}
if (!$hasCoreExtension) {
array_unshift($extensions, new CoreExtension());
}
}
if (\count($this->types) > 0 || \count($this->typeExtensions) > 0 || \count($this->typeGuessers) > 0) {
if (\count($this->typeGuessers) > 1) {
$typeGuesser = new FormTypeGuesserChain($this->typeGuessers);

View File

@ -11,8 +11,6 @@
namespace Symfony\Component\Form;
use Symfony\Component\Form\Extension\Core\CoreExtension;
/**
* Entry point of the Form component.
*
@ -105,10 +103,7 @@ final class Forms
*/
public static function createFormFactoryBuilder()
{
$builder = new FormFactoryBuilder();
$builder->addExtension(new CoreExtension());
return $builder;
return new FormFactoryBuilder(true);
}
/**