From eabb7a17ed9155d2aeed032c1e0b17b3a867fb75 Mon Sep 17 00:00:00 2001 From: Bernhard Schussek Date: Thu, 25 Apr 2013 16:08:09 +0200 Subject: [PATCH] [Form] Added support for PATCH requests --- src/Symfony/Component/Form/Button.php | 5 +-- src/Symfony/Component/Form/CHANGELOG.md | 1 + .../HttpFoundationRequestHandler.php | 2 +- src/Symfony/Component/Form/Form.php | 8 +++-- src/Symfony/Component/Form/FormInterface.php | 7 ++-- .../Component/Form/NativeRequestHandler.php | 2 +- src/Symfony/Component/Form/SubmitButton.php | 7 ++-- .../Form/Tests/AbstractRequestHandlerTest.php | 34 +++++++++---------- .../Component/Form/Tests/CompoundFormTest.php | 25 ++++++++++++++ 9 files changed, 62 insertions(+), 29 deletions(-) diff --git a/src/Symfony/Component/Form/Button.php b/src/Symfony/Component/Form/Button.php index 6961dd8d78..8c5247d45f 100644 --- a/src/Symfony/Component/Form/Button.php +++ b/src/Symfony/Component/Form/Button.php @@ -358,13 +358,14 @@ class Button implements \IteratorAggregate, FormInterface /** * Submits data to the button. * - * @param null|string $submittedData The data + * @param null|string $submittedData The data. + * @param Boolean $clearMissing Not used. * * @return Button The button instance * * @throws Exception\AlreadySubmittedException If the button has already been submitted. */ - public function submit($submittedData) + public function submit($submittedData, $clearMissing = true) { if ($this->submitted) { throw new AlreadySubmittedException('A form can only be submitted once'); diff --git a/src/Symfony/Component/Form/CHANGELOG.md b/src/Symfony/Component/Form/CHANGELOG.md index c0fc6d06de..9a9f577a9b 100644 --- a/src/Symfony/Component/Form/CHANGELOG.md +++ b/src/Symfony/Component/Form/CHANGELOG.md @@ -24,6 +24,7 @@ CHANGELOG * added methods submit() and isSubmitted() to Form * deprecated bind() and isBound() in Form * deprecated AlreadyBoundException in favor of AlreadySubmittedException + * added support for PATCH requests 2.2.0 ----- diff --git a/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php b/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php index 6457de7477..dcb6ede2b3 100644 --- a/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php +++ b/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php @@ -75,6 +75,6 @@ class HttpFoundationRequestHandler implements RequestHandlerInterface return; } - $form->submit($data); + $form->submit($data, 'PATCH' !== $method); } } diff --git a/src/Symfony/Component/Form/Form.php b/src/Symfony/Component/Form/Form.php index 9ad47905ad..974168a9a7 100644 --- a/src/Symfony/Component/Form/Form.php +++ b/src/Symfony/Component/Form/Form.php @@ -464,7 +464,7 @@ class Form implements \IteratorAggregate, FormInterface /** * {@inheritdoc} */ - public function submit($submittedData) + public function submit($submittedData, $clearMissing = true) { if ($this->submitted) { throw new AlreadySubmittedException('A form can only be submitted once'); @@ -518,8 +518,10 @@ class Form implements \IteratorAggregate, FormInterface } foreach ($this->children as $name => $child) { - $child->submit(isset($submittedData[$name]) ? $submittedData[$name] : null); - unset($submittedData[$name]); + if (isset($submittedData[$name]) || $clearMissing) { + $child->submit(isset($submittedData[$name]) ? $submittedData[$name] : null, $clearMissing); + unset($submittedData[$name]); + } } $this->extraData = $submittedData; diff --git a/src/Symfony/Component/Form/FormInterface.php b/src/Symfony/Component/Form/FormInterface.php index 1069398ba8..1e35f788cb 100644 --- a/src/Symfony/Component/Form/FormInterface.php +++ b/src/Symfony/Component/Form/FormInterface.php @@ -242,13 +242,16 @@ interface FormInterface extends \ArrayAccess, \Traversable, \Countable /** * Submits data to the form, transforms and validates it. * - * @param null|string|array $submittedData The submitted data. + * @param null|string|array $submittedData The submitted data. + * @param Boolean $clearMissing Whether to set fields to NULL + * when they are missing in the + * submitted data. * * @return FormInterface The form instance * * @throws Exception\AlreadySubmittedException If the form has already been submitted. */ - public function submit($submittedData); + public function submit($submittedData, $clearMissing = true); /** * Returns the root of the form tree. diff --git a/src/Symfony/Component/Form/NativeRequestHandler.php b/src/Symfony/Component/Form/NativeRequestHandler.php index 6ddb8d72a3..aaa4e4c0f2 100644 --- a/src/Symfony/Component/Form/NativeRequestHandler.php +++ b/src/Symfony/Component/Form/NativeRequestHandler.php @@ -90,7 +90,7 @@ class NativeRequestHandler implements RequestHandlerInterface return; } - $form->submit($data); + $form->submit($data, 'PATCH' !== $method); } /** diff --git a/src/Symfony/Component/Form/SubmitButton.php b/src/Symfony/Component/Form/SubmitButton.php index a169ba6529..47d4be0e28 100644 --- a/src/Symfony/Component/Form/SubmitButton.php +++ b/src/Symfony/Component/Form/SubmitButton.php @@ -34,15 +34,16 @@ class SubmitButton extends Button implements ClickableInterface /** * Submits data to the button. * - * @param null|string $submittedData The data + * @param null|string $submittedData The data. + * @param Boolean $clearMissing Not used. * * @return SubmitButton The button instance * * @throws Exception\AlreadySubmittedException If the form has already been submitted. */ - public function submit($submittedData) + public function submit($submittedData, $clearMissing = true) { - parent::submit($submittedData); + parent::submit($submittedData, $clearMissing); $this->clicked = null !== $submittedData; diff --git a/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php b/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php index 1890ec00aa..cef8f3bf0d 100644 --- a/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php +++ b/src/Symfony/Component/Form/Tests/AbstractRequestHandlerTest.php @@ -58,8 +58,8 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase )); $form->expects($this->once()) - ->method('Submit') - ->with('DATA'); + ->method('submit') + ->with('DATA', 'PATCH' !== $method); $this->requestHandler->handleRequest($form, $this->request); } @@ -78,7 +78,7 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase )); $form->expects($this->never()) - ->method('Submit'); + ->method('submit'); $this->requestHandler->handleRequest($form, $this->request); } @@ -95,8 +95,8 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase )); $form->expects($this->once()) - ->method('Submit') - ->with($this->identicalTo(null)); + ->method('submit') + ->with($this->identicalTo(null), 'PATCH' !== $method); $this->requestHandler->handleRequest($form, $this->request); } @@ -113,8 +113,8 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase )); $form->expects($this->once()) - ->method('Submit') - ->with($this->identicalTo(array())); + ->method('submit') + ->with($this->identicalTo(array()), 'PATCH' !== $method); $this->requestHandler->handleRequest($form, $this->request); } @@ -128,7 +128,7 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase )); $form->expects($this->never()) - ->method('Submit'); + ->method('submit'); $this->requestHandler->handleRequest($form, $this->request); } @@ -152,8 +152,8 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase )); $form->expects($this->once()) - ->method('Submit') - ->with($requestData); + ->method('submit') + ->with($requestData, 'PATCH' !== $method); $this->requestHandler->handleRequest($form, $this->request); } @@ -176,7 +176,7 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase )); $form->expects($this->never()) - ->method('Submit'); + ->method('submit'); $this->requestHandler->handleRequest($form, $this->request); } @@ -200,11 +200,11 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase )); $form->expects($this->once()) - ->method('Submit') + ->method('submit') ->with(array( 'field1' => 'DATA', 'field2' => $file, - )); + ), 'PATCH' !== $method); $this->requestHandler->handleRequest($form, $this->request); } @@ -224,8 +224,8 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase )); $form->expects($this->once()) - ->method('Submit') - ->with('DATA'); + ->method('submit') + ->with('DATA', 'PATCH' !== $method); $this->requestHandler->handleRequest($form, $this->request); } @@ -245,8 +245,8 @@ abstract class AbstractRequestHandlerTest extends \PHPUnit_Framework_TestCase )); $form->expects($this->once()) - ->method('Submit') - ->with($file); + ->method('submit') + ->with($file, 'PATCH' !== $method); $this->requestHandler->handleRequest($form, $this->request); } diff --git a/src/Symfony/Component/Form/Tests/CompoundFormTest.php b/src/Symfony/Component/Form/Tests/CompoundFormTest.php index f213db3126..fdd1a0e9b7 100644 --- a/src/Symfony/Component/Form/Tests/CompoundFormTest.php +++ b/src/Symfony/Component/Form/Tests/CompoundFormTest.php @@ -58,6 +58,31 @@ class CompoundFormTest extends AbstractFormTest $this->form->submit(array()); } + public function testSubmitDoesNotForwardNullIfNotClearMissing() + { + $child = $this->getMockForm('firstName'); + + $this->form->add($child); + + $child->expects($this->never()) + ->method('submit'); + + $this->form->submit(array(), false); + } + + public function testClearMissingFlagIsForwarded() + { + $child = $this->getMockForm('firstName'); + + $this->form->add($child); + + $child->expects($this->once()) + ->method('submit') + ->with($this->equalTo('foo'), false); + + $this->form->submit(array('firstName' => 'foo'), false); + } + public function testCloneChildren() { $child = $this->getBuilder('child')->getForm();