From 49d2685bff97baaf02ea1c97d3ce25e7c38a7744 Mon Sep 17 00:00:00 2001 From: Joseph Bielawski Date: Fri, 7 Oct 2011 13:44:51 +0200 Subject: [PATCH] [Form] Add default validation to TextType field (and related) --- .../ValueToStringTransformer.php | 67 ++++++++++++++ .../Form/Extension/Core/Type/TextType.php | 12 +++ .../ValueToStringTransformerTest.php | 90 +++++++++++++++++++ .../Form/Extension/Core/Type/UrlTypeTest.php | 2 +- 4 files changed, 170 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToStringTransformer.php create mode 100644 tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/ValueToStringTransformerTest.php diff --git a/src/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToStringTransformer.php b/src/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToStringTransformer.php new file mode 100644 index 0000000000..c9538f4032 --- /dev/null +++ b/src/Symfony/Component/Form/Extension/Core/DataTransformer/ValueToStringTransformer.php @@ -0,0 +1,67 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Form\Extension\Core\DataTransformer; + +use Symfony\Component\Form\DataTransformerInterface; +use Symfony\Component\Form\Exception\UnexpectedTypeException; + +/** + * Transforms between a given value and a string. + * + * @author Joseph Bielawski + */ +class ValueToStringTransformer implements DataTransformerInterface +{ + /** + * Transforms a value into a string. + * + * @param mixed $value Mixed value. + * + * @return string String value. + * + * @throws UnexpectedTypeException if the given value is not a string or number + */ + public function transform($value) + { + if (null === $value) { + return ''; + } + + if (!is_string($value) && !is_numeric($value)) { + throw new UnexpectedTypeException($value, 'string or number'); + } + + return $value; + } + + /** + * Transforms a value into a string. + * + * @param string $value String value. + * + * @return string String value. + * + * @throws UnexpectedTypeException if the given value is not a string + */ + public function reverseTransform($value) + { + if (null === $value) { + return ''; + } + + if (!is_string($value)) { + throw new UnexpectedTypeException($value, 'string'); + } + + return $value; + } +} diff --git a/src/Symfony/Component/Form/Extension/Core/Type/TextType.php b/src/Symfony/Component/Form/Extension/Core/Type/TextType.php index bceb6af7e3..2800311934 100644 --- a/src/Symfony/Component/Form/Extension/Core/Type/TextType.php +++ b/src/Symfony/Component/Form/Extension/Core/Type/TextType.php @@ -12,9 +12,21 @@ namespace Symfony\Component\Form\Extension\Core\Type; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\FormBuilder; +use Symfony\Component\Form\Extension\Core\DataTransformer\ValueToStringTransformer; class TextType extends AbstractType { + /** + * {@inheritdoc} + */ + public function buildForm(FormBuilder $builder, array $options) + { + $builder + ->appendClientTransformer(new ValueToStringTransformer()) + ; + } + /** * {@inheritdoc} */ diff --git a/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/ValueToStringTransformerTest.php b/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/ValueToStringTransformerTest.php new file mode 100644 index 0000000000..e1a79ae14a --- /dev/null +++ b/tests/Symfony/Tests/Component/Form/Extension/Core/DataTransformer/ValueToStringTransformerTest.php @@ -0,0 +1,90 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Tests\Component\Form\Extension\Core\DataTransformer; + +use Symfony\Component\Form\Extension\Core\DataTransformer\ValueToStringTransformer; + +class ValueToStringTransformerTest extends \PHPUnit_Framework_TestCase +{ + protected $transformer; + + protected function setUp() + { + $this->transformer = new ValueToStringTransformer(); + } + + protected function tearDown() + { + $this->transformer = null; + } + + /** + * @dataProvider validDataProvider + */ + public function testTransform($value, $transformed) + { + $this->assertEquals($transformed, $this->transformer->transform($value)); + } + + /** + * @dataProvider validDataProvider + */ + public function testReverseTransform($value, $transformed) + { + $this->assertEquals($transformed, $this->transformer->reverseTransform($transformed)); + } + + public function validDataProvider() + { + return array( + array('test', 'test'), + array('', null), + array(null, null), + + array(0, '0'), + array('0', '0'), + array(1, '1'), + array('123', '123'), + array(1.23, '1.23'), + ); + } + + /** + * @dataProvider invalidDataProvider + */ + public function testTransformExpectsStringOrNumber($value) + { + $this->setExpectedException('Symfony\Component\Form\Exception\UnexpectedTypeException'); + + $this->transformer->transform($value); + } + + /** + * @dataProvider invalidDataProvider + */ + public function testReverseTransformExpectsString($value) + { + $this->setExpectedException('Symfony\Component\Form\Exception\UnexpectedTypeException'); + + $this->transformer->reverseTransform($value); + } + + public function invalidDataProvider() + { + return array( + array(true), + array(false), + array(new \stdClass), + array(array()), + ); + } +} diff --git a/tests/Symfony/Tests/Component/Form/Extension/Core/Type/UrlTypeTest.php b/tests/Symfony/Tests/Component/Form/Extension/Core/Type/UrlTypeTest.php index 1bed5346c2..8343980e4a 100644 --- a/tests/Symfony/Tests/Component/Form/Extension/Core/Type/UrlTypeTest.php +++ b/tests/Symfony/Tests/Component/Form/Extension/Core/Type/UrlTypeTest.php @@ -46,7 +46,7 @@ class UrlTypeTest extends LocalizedTestCase $form->bind(''); - $this->assertNull($form->getData()); + $this->assertSame('', $form->getData()); $this->assertSame('', $form->getClientData()); }