8000 [Form] let `TextType` implements `DataTransformerInterface` · symfony/symfony@4ad7303 · GitHub
[go: up one dir, main page]

Skip to content
10000

Commit 4ad7303

Browse files
committed
[Form] let TextType implements DataTransformerInterface
closes #5906. The submitted data should always be transformed back to the model as a string as NULL in this case could stand for "unset this value" whereas a string property of a class could rely on the string type. Furthermore, this prevents potential issues with PHP 7 which allows type hinting of strings in functions.
1 parent 2946932 commit 4ad7303

File tree

4 files changed

+67
-3
lines changed

4 files changed

+67
-3
lines changed

UPGRADE-3.1.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ Form
1818
* Support for data objects that implements both `Traversable` and `ArrayAccess`
1919
in `ResizeFormListener::preSubmit` method has been deprecated and will be
2020
removed in Symfony 4.0.
21+
* `TextType` now implements `DataTransformerInterface` and will always return
22+
an empty string when `empty_data` option is explicitly assigned to it.
2123

2224
FrameworkBundle
2325
---------------

src/Symfony/Component/Form/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ CHANGELOG
77
* deprecated the "choices_as_values" option of ChoiceType
88
* deprecated support for data objects that implements both `Traversable` and
99
`ArrayAccess` in `ResizeFormListener::preSubmit` method
10+
* implemented `DataTransformerInterface` in `TextType`
1011

1112
3.0.0
1213
-----

src/Symfony/Component/Form/Extension/Core/Type/TextType.php

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,24 @@
1212
namespace Symfony\Component\Form\Extension\Core\Type;
1313

1414
use Symfony\Component\Form\AbstractType;
15+
use Symfony\Component\Form\DataTransformerInterface;
16+
use Symfony\Component\Form\FormBuilderInterface;
1517
use Symfony\Component\OptionsResolver\OptionsResolver;
1618

17-
class TextType extends AbstractType
19+
class TextType extends AbstractType implements DataTransformerInterface
1820
{
21+
public function buildForm(FormBuilderInterface $builder, array $options)
22+
{
23+
// When empty_data is explicitly set to an empty string,
24+
// a string should always be returned when NULL is submitted
25+
// This gives more control and thus helps preventing some issues
26+
// with PHP 7 which allows type hinting strings in functions
27+
// See https://github.com/symfony/symfony/issues/5906#issuecomment-203189375
28+
if ('' === $options['empty_data']) {
29+
$builder->addViewTransformer($this);
30+
}
31+
}
32+
1933
/**
2034
* {@inheritdoc}
2135
*/
@@ -29,8 +43,18 @@ public function configureOptions(OptionsResolver $resolver)
2943
/**
3044
* {@inheritdoc}
3145
*/
32-
public function getBlockPrefix()
46+
public function transform($data)
47+
{
48+
// Model data should not be transformed
49+
return $data;
50+
}
51+
52+
/**
53+
* {@inheritdoc}
54+
*.
55+
*/
56+
public function reverseTransform($data)
3357
{
34-
return 'text';
58+
return empty($data) ? '' : $data;
3559
}
3660
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Form\Tests\Extension\Core\Type;
13+
14+
use Symfony\Component\Form\Test\TypeTestCase as TestCase;
15+
16+
class TextTypeTest extends TestCase
17+
{
18+
public function testSubmitNullReturnsNull()
19+
{
20+
$form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\TextType', 'name');
21+
22+
$form->submit(null);
23+
24+
$this->assertNull($form->getData());
25+
}
26+
27+
public function testSubmitNullReturnsEmptyStringWithEmptyDataAsString()
28+
{
29+
$form = $this->factory->create('Symfony\Component\Form\Extension\Core\Type\TextType', 'name', array(
30+
'empty_data' => '',
31+
));
32+
33+
$form->submit(null);
34+
35+
$this->assertSame('', $form->getData());
36+
}
37+
}

0 commit comments

Comments
 (0)
0