diff --git a/UPGRADE-5.1.md b/UPGRADE-5.1.md index 456b1d0bf1ca3..a7b1a8f67a20e 100644 --- a/UPGRADE-5.1.md +++ b/UPGRADE-5.1.md @@ -39,6 +39,8 @@ EventDispatcher Form ---- + * Not configuring the `rounding_mode` option of the `PercentType` is deprecated. It will default to `PercentToLocalizedStringTransformer::ROUND_HALF_UP` in Symfony 6. + * Not passing a rounding mode to the constructor of `PercentToLocalizedStringTransformer` is deprecated. It will default to `ROUND_HALF_UP` in Symfony 6. * Implementing the `FormConfigInterface` without implementing the `getIsEmptyCallback()` method is deprecated. The method will be added to the interface in 6.0. * Implementing the `FormConfigBuilderInterface` without implementing the `setIsEmptyCallback()` method diff --git a/UPGRADE-6.0.md b/UPGRADE-6.0.md index c92e3a6312e4e..fa12bc48884cb 100644 --- a/UPGRADE-6.0.md +++ b/UPGRADE-6.0.md @@ -39,6 +39,8 @@ EventDispatcher Form ---- + * The default value of the `rounding_mode` option of the `PercentType` has been changed to `PercentToLocalizedStringTransformer::ROUND_HALF_UP`. + * The default rounding mode of the `PercentToLocalizedStringTransformer` has been changed to `ROUND_HALF_UP`. * Added the `getIsEmptyCallback()` method to the `FormConfigInterface`. * Added the `setIsEmptyCallback()` method to the `FormConfigBuilderInterface`. * Added argument `callable|null $filter` to `ChoiceListFactoryInterface::createListFromChoices()` and `createListFromLoader()`. diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index 0d7d7efed0c6c..6fe848d9e8fdc 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -4,6 +4,8 @@ CHANGELOG 5.1.0 ----- + * Deprecated not configuring the `rounding_mode` option of the `PercentType`. It will default to `PercentToLocalizedStringTransformer::ROUND_HALF_UP` in Symfony 6. + * Deprecated not passing a rounding mode to the constructor of `PercentToLocalizedStringTransformer`. It will default to `ROUND_HALF_UP` in Symfony 6. * Added `collection_entry` block prefix to `CollectionType` entries * Added a `choice_filter` option to `ChoiceType` * Added argument `callable|null $filter` to `ChoiceListFactoryInterface::createListFromChoices()` and `createListFromLoader()` - not defining them is deprecated. diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php index f94dacfce0417..c12597e73c0c5 100644 --- a/src/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/PercentToLocalizedStringTransformer.php @@ -80,8 +80,7 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface self::INTEGER, ]; - protected $roundingMode; - + private $roundingMode; private $type; private $scale; @@ -93,7 +92,7 @@ class PercentToLocalizedStringTransformer implements DataTransformerInterface * * @throws UnexpectedTypeException if the given value of type is unknown */ - public function __construct(int $scale = null, string $type = null, ?int $roundingMode = self::ROUND_HALF_UP) + public function __construct(int $scale = null, string $type = null, ?int $roundingMode = null) { if (null === $scale) { $scale = 0; @@ -103,8 +102,8 @@ public function __construct(int $scale = null, string $type = null, ?int $roundi $type = self::FRACTIONAL; } - if (null === $roundingMode) { - $roundingMode = self::ROUND_HALF_UP; + if (null === $roundingMode && (\func_num_args() < 4 || func_get_arg(3))) { + trigger_deprecation('symfony/form', '5.1', sprintf('Not passing a rounding mode to %s() is deprecated. Starting with Symfony 6.0 it will default to "%s::ROUND_HALF_UP".', __METHOD__, __CLASS__)); } if (!\in_array($type, self::$types, true)) { @@ -235,7 +234,10 @@ protected function getNumberFormatter() $formatter = new \NumberFormatter(\Locale::getDefault(), \NumberFormatter::DECIMAL); $formatter->setAttribute(\NumberFormatter::FRACTION_DIGITS, $this->scale); - $formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, $this->roundingMode); + + if (null !== $this->roundingMode) { + $formatter->setAttribute(\NumberFormatter::ROUNDING_MODE, $this->roundingMode); + } return $formatter; } diff --git a/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php b/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php index d43c33d6621e6..7581912986c9e 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/PercentType.php @@ -12,11 +12,11 @@ namespace Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\AbstractType; -use Symfony\Component\Form\Extension\Core\DataTransformer\NumberToLocalizedStringTransformer; use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormInterface; use Symfony\Component\Form\FormView; +use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; class PercentType extends AbstractType @@ -29,7 +29,8 @@ public function buildForm(FormBuilderInterface $builder, array $options) $builder->addViewTransformer(new PercentToLocalizedStringTransformer( $options['scale'], $options['type'], - $options['rounding_mode'] + $options['rounding_mode'], + false )); } @@ -48,7 +49,11 @@ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'scale' => 0, - 'rounding_mode' => NumberToLocalizedStringTransformer::ROUND_HALF_UP, + 'rounding_mode' => function (Options $options) { + trigger_deprecation('symfony/form', '5.1', sprintf('Not configuring the "rounding_mode" option is deprecated. It will default to "%s::ROUND_HALF_UP" in Symfony 6.0.', PercentToLocalizedStringTransformer::class)); + + return null; + }, 'symbol' => '%', 'type' => 'fractional', 'compound' => false, @@ -59,16 +64,24 @@ public function configureOptions(OptionsResolver $resolver) 'integer', ]); $resolver->setAllowedValues('rounding_mode', [ - NumberToLocalizedStringTransformer::ROUND_FLOOR, - NumberToLocalizedStringTransformer::ROUND_DOWN, - NumberToLocalizedStringTransformer::ROUND_HALF_DOWN, - NumberToLocalizedStringTransformer::ROUND_HALF_EVEN, - NumberToLocalizedStringTransformer::ROUND_HALF_UP, - NumberToLocalizedStringTransformer::ROUND_UP, - NumberToLocalizedStringTransformer::ROUND_CEILING, + null, + PercentToLocalizedStringTransformer::ROUND_FLOOR, + PercentToLocalizedStringTransformer::ROUND_DOWN, + PercentToLocalizedStringTransformer::ROUND_HALF_DOWN, + PercentToLocalizedStringTransformer::ROUND_HALF_EVEN, + PercentToLocalizedStringTransformer::ROUND_HALF_UP, + PercentToLocalizedStringTransformer::ROUND_UP, + PercentToLocalizedStringTransformer::ROUND_CEILING, ]); $resolver->setAllowedTypes('scale', 'int'); $resolver->setAllowedTypes('symbol', ['bool', 'string']); + $resolver->setDeprecated('rounding_mode', 'symfony/form', '5.1', function (Options $options, $roundingMode) { + if (null === $roundingMode) { + return sprintf('Not configuring the "rounding_mode" option is deprecated. It will default to "%s::ROUND_HALF_UP" in Symfony 6.0.', PercentToLocalizedStringTransformer::class); + } + + return ''; + }); } /** diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php index 62c86d971084a..20f11ae29d17a 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/PercentToLocalizedStringTransformerTest.php @@ -12,11 +12,14 @@ namespace Symfony\Component\Form\Tests\Extension\Core\DataTransformer; use PHPUnit\Framework\TestCase; +use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer; use Symfony\Component\Intl\Util\IntlTestHelper; class PercentToLocalizedStringTransformerTest extends TestCase { + use ExpectDeprecationTrait; + private $defaultLocale; protected function setUp(): void @@ -32,7 +35,7 @@ protected function tearDown(): void public function testTransform() { - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->assertEquals('10', $transformer->transform(0.1)); $this->assertEquals('15', $transformer->transform(0.15)); @@ -42,14 +45,14 @@ public function testTransform() public function testTransformEmpty() { - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->assertEquals('', $transformer->transform(null)); } public function testTransformWithInteger() { - $transformer = new PercentToLocalizedStringTransformer(null, 'integer'); + $transformer = new PercentToLocalizedStringTransformer(null, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->assertEquals('0', $transformer->transform(0.1)); $this->assertEquals('1', $transformer->transform(1)); @@ -64,14 +67,26 @@ public function testTransformWithScale() \Locale::setDefault('de_AT'); - $transformer = new PercentToLocalizedStringTransformer(2); + $transformer = new PercentToLocalizedStringTransformer(2, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->assertEquals('12,34', $transformer->transform(0.1234)); } + /** + * @group legacy + */ + public function testReverseTransformWithScaleAndRoundingDisabled() + { + $this->expectDeprecation('Since symfony/form 5.1: Not passing a rounding mode to Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer::__construct() is deprecated. Starting with Symfony 6.0 it will default to Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer::ROUND_HALF_UP.'); + + $transformer = new PercentToLocalizedStringTransformer(2, PercentToLocalizedStringTransformer::FRACTIONAL); + + $this->assertEquals(0.0123456, $transformer->reverseTransform('1.23456')); + } + public function testReverseTransform() { - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->assertEquals(0.1, $transformer->reverseTransform('10')); $this->assertEquals(0.15, $transformer->reverseTransform('15')); @@ -184,14 +199,14 @@ public function testReverseTransformWithRounding($type, $scale, $input, $output, public function testReverseTransformEmpty() { - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->assertNull($transformer->reverseTransform('')); } public function testReverseTransformWithInteger() { - $transformer = new PercentToLocalizedStringTransformer(null, 'integer'); + $transformer = new PercentToLocalizedStringTransformer(null, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->assertEquals(10, $transformer->reverseTransform('10')); $this->assertEquals(15, $transformer->reverseTransform('15')); @@ -206,14 +221,14 @@ public function testReverseTransformWithScale() \Locale::setDefault('de_AT'); - $transformer = new PercentToLocalizedStringTransformer(2); + $transformer = new PercentToLocalizedStringTransformer(2, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->assertEquals(0.1234, $transformer->reverseTransform('12,34')); } public function testTransformExpectsNumeric() { - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); @@ -222,7 +237,7 @@ public function testTransformExpectsNumeric() public function testReverseTransformExpectsString() { - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); @@ -234,7 +249,7 @@ public function testDecimalSeparatorMayBeDotIfGroupingSeparatorIsNotDot() IntlTestHelper::requireFullIntl($this, '4.8.1.1'); \Locale::setDefault('fr'); - $transformer = new PercentToLocalizedStringTransformer(1, 'integer'); + $transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP); // completely valid format $this->assertEquals(1234.5, $transformer->reverseTransform('1 234,5')); @@ -253,7 +268,7 @@ public function testDecimalSeparatorMayNotBeDotIfGroupingSeparatorIsDot() \Locale::setDefault('de_DE'); - $transformer = new PercentToLocalizedStringTransformer(1, 'integer'); + $transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP); $transformer->reverseTransform('1.234.5'); } @@ -266,7 +281,7 @@ public function testDecimalSeparatorMayNotBeDotIfGroupingSeparatorIsDotWithNoGro \Locale::setDefault('de_DE'); - $transformer = new PercentToLocalizedStringTransformer(1, 'integer'); + $transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP); $transformer->reverseTransform('1234.5'); } @@ -277,7 +292,7 @@ public function testDecimalSeparatorMayBeDotIfGroupingSeparatorIsDotButNoGroupin IntlTestHelper::requireFullIntl($this, false); \Locale::setDefault('fr'); - $transformer = new PercentToLocalizedStringTransformer(1, 'integer'); + $transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP); $this->assertEquals(1234.5, $transformer->reverseTransform('1234,5')); $this->assertEquals(1234.5, $transformer->reverseTransform('1234.5')); @@ -289,7 +304,7 @@ public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsNotComma() IntlTestHelper::requireFullIntl($this, '4.8.1.1'); \Locale::setDefault('bg'); - $transformer = new PercentToLocalizedStringTransformer(1, 'integer'); + $transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP); // completely valid format $this->assertEquals(1234.5, $transformer->reverseTransform('1 234.5')); @@ -305,7 +320,7 @@ public function testDecimalSeparatorMayNotBeCommaIfGroupingSeparatorIsComma() $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); IntlTestHelper::requireFullIntl($this, '4.8.1.1'); - $transformer = new PercentToLocalizedStringTransformer(1, 'integer'); + $transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP); $transformer->reverseTransform('1,234,5'); } @@ -315,7 +330,7 @@ public function testDecimalSeparatorMayNotBeCommaIfGroupingSeparatorIsCommaWithN $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); IntlTestHelper::requireFullIntl($this, '4.8.1.1'); - $transformer = new PercentToLocalizedStringTransformer(1, 'integer'); + $transformer = new PercentToLocalizedStringTransformer(1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP); $transformer->reverseTransform('1234,5'); } @@ -328,7 +343,7 @@ public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsCommaButNoGro $transformer = $this->getMockBuilder('Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer') ->setMethods(['getNumberFormatter']) - ->setConstructorArgs([1, 'integer']) + ->setConstructorArgs([1, 'integer', PercentToLocalizedStringTransformer::ROUND_HALF_UP]) ->getMock(); $transformer->expects($this->any()) ->method('getNumberFormatter') @@ -341,7 +356,7 @@ public function testDecimalSeparatorMayBeCommaIfGroupingSeparatorIsCommaButNoGro public function testReverseTransformDisallowsLeadingExtraCharacters() { $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $transformer->reverseTransform('foo123'); } @@ -350,7 +365,7 @@ public function testReverseTransformDisallowsCenteredExtraCharacters() { $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); $this->expectExceptionMessage('The number contains unrecognized characters: "foo3"'); - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $transformer->reverseTransform('12foo3'); } @@ -367,7 +382,7 @@ public function testReverseTransformDisallowsCenteredExtraCharactersMultibyte() \Locale::setDefault('ru'); - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $transformer->reverseTransform("12\xc2\xa0345,67foo8"); } @@ -376,7 +391,7 @@ public function testReverseTransformDisallowsTrailingExtraCharacters() { $this->expectException('Symfony\Component\Form\Exception\TransformationFailedException'); $this->expectExceptionMessage('The number contains unrecognized characters: "foo"'); - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $transformer->reverseTransform('123foo'); } @@ -393,7 +408,7 @@ public function testReverseTransformDisallowsTrailingExtraCharactersMultibyte() \Locale::setDefault('ru'); - $transformer = new PercentToLocalizedStringTransformer(); + $transformer = new PercentToLocalizedStringTransformer(null, null, PercentToLocalizedStringTransformer::ROUND_HALF_UP); $transformer->reverseTransform("12\xc2\xa0345,678foo"); } diff --git a/src/Symfony/Component/Form/Tests/Extension/Core/Type/PercentTypeTest.php b/src/Symfony/Component/Form/Tests/Extension/Core/Type/PercentTypeTest.php new file mode 100644 index 0000000000000..f7140087c79d5 --- /dev/null +++ b/src/Symfony/Component/Form/Tests/Extension/Core/Type/PercentTypeTest.php @@ -0,0 +1,69 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Tests\Extension\Core\Type; + +use Symfony\Bridge\PhpUnit\ExpectDeprecationTrait; +use Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer; +use Symfony\Component\Form\Extension\Core\Type\PercentType; +use Symfony\Component\Form\Test\TypeTestCase; + +class PercentTypeTest extends TypeTestCase +{ + use ExpectDeprecationTrait; + + const TESTED_TYPE = PercentType::class; + + public function testSubmitWithRoundingMode() + { + $form = $this->factory->create(self::TESTED_TYPE, null, [ + 'scale' => 2, + 'rounding_mode' => PercentToLocalizedStringTransformer::ROUND_CEILING, + ]); + + $form->submit('1.23456'); + + $this->assertEquals(0.0124, $form->getData()); + } + + /** + * @group legacy + */ + public function testSubmitWithoutRoundingMode() + { + $this->expectDeprecation('Since symfony/form 5.1: Not configuring the "rounding_mode" option is deprecated. It will default to Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer::ROUND_HALF_UP in Symfony 6.0.'); + + $form = $this->factory->create(self::TESTED_TYPE, null, [ + 'scale' => 2, + ]); + + $form->submit('1.23456'); + + $this->assertEquals(0.0123456, $form->getData()); + } + + /** + * @group legacy + */ + public function testSubmitWithNullRoundingMode() + { + $this->expectDeprecation('Since symfony/form 5.1: Not configuring the "rounding_mode" option is deprecated. It will default to Symfony\Component\Form\Extension\Core\DataTransformer\PercentToLocalizedStringTransformer::ROUND_HALF_UP in Symfony 6.0.'); + + $form = $this->factory->create(self::TESTED_TYPE, null, [ + 'rounding_mode' => null, + 'scale' => 2, + ]); + + $form->submit('1.23456'); + + $this->assertEquals(0.0123456, $form->getData()); + } +}
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: