From 4a6f2f9e95e5d2a36571479609dc484a00225d03 Mon Sep 17 00:00:00 2001 From: Akihito Koriyama Date: Wed, 16 Sep 2015 07:59:33 +0900 Subject: [PATCH 1/3] @InputValidation throw exception when validation failed. --- src/AbstractForm.php | 3 -- src/Annotation/AbstractValidation.php | 19 ++++++++++++ src/Annotation/FormValidation.php | 7 +---- src/Annotation/InputValidation.php | 15 ++++++++++ src/AntiCsrf.php | 6 ++-- src/AuraInputInterceptor.php | 12 ++++---- src/AuraInputModule.php | 7 +++++ src/FailureHandlerInterface.php | 5 ++-- src/InputValidationInterceptor.php | 29 ++++++++++++++++++ src/OnFailureMethodHandler.php | 8 ++--- src/VndErrorHandler.php | 5 ++-- tests/AbstractAuraFormTest.php | 4 --- tests/AbstractFormTest.php | 1 - tests/AuraInputModuleTest.php | 8 ++++- tests/Fake/FakeInputValidationController.php | 31 ++++++++++++++++++++ 15 files changed, 127 insertions(+), 33 deletions(-) create mode 100644 src/Annotation/AbstractValidation.php create mode 100644 src/Annotation/InputValidation.php create mode 100644 src/InputValidationInterceptor.php create mode 100644 tests/Fake/FakeInputValidationController.php diff --git a/src/AbstractForm.php b/src/AbstractForm.php index 1294bad..0a19018 100644 --- a/src/AbstractForm.php +++ b/src/AbstractForm.php @@ -148,13 +148,10 @@ public function getFailureMessages() return $messages; } - /** - * * Returns all the fields collection * * @return \ArrayIterator - * */ public function getIterator() { diff --git a/src/Annotation/AbstractValidation.php b/src/Annotation/AbstractValidation.php new file mode 100644 index 0000000..b9daa11 --- /dev/null +++ b/src/Annotation/AbstractValidation.php @@ -0,0 +1,19 @@ +session = $session; diff --git a/src/AuraInputInterceptor.php b/src/AuraInputInterceptor.php index a61e59d..70fba80 100644 --- a/src/AuraInputInterceptor.php +++ b/src/AuraInputInterceptor.php @@ -10,6 +10,7 @@ use Doctrine\Common\Annotations\Reader; use Ray\Aop\MethodInterceptor; use Ray\Aop\MethodInvocation; +use Ray\WebFormModule\Annotation\AbstractValidation; use Ray\WebFormModule\Annotation\FormValidation; use Ray\WebFormModule\Exception\InvalidArgumentException; use Ray\WebFormModule\Exception\InvalidFormPropertyException; @@ -19,15 +20,16 @@ class AuraInputInterceptor implements MethodInterceptor /** * @var Reader */ - private $reader; + protected $reader; /** * @var FailureHandlerInterface */ - private $failureHandler; + protected $failureHandler; /** - * @param Reader $reader Annotation reader + * @param Reader $reader + * @param FailureHandlerInterface $handler */ public function __construct(Reader $reader, FailureHandlerInterface $handler) { @@ -44,7 +46,7 @@ public function invoke(MethodInvocation $invocation) { $object = $invocation->getThis(); /* @var $formValidation FormValidation */ - $formValidation = $this->reader->getMethodAnnotation($invocation->getMethod(), FormValidation::class); + $formValidation = $this->reader->getMethodAnnotation($invocation->getMethod(), AbstractValidation::class); $form = $this->getFormProperty($formValidation, $object); $data = $object instanceof SubmitInterface ? $object->submit() : $this->getNamedArguments($invocation); $isValid = $this->isValid($data, $form); @@ -99,7 +101,7 @@ public function isValid(array $submit, AbstractForm $form) * * @return AbstractForm */ - private function getFormProperty(FormValidation $formValidation, $object) + private function getFormProperty(AbstractValidation $formValidation, $object) { if (! property_exists($object, $formValidation->form)) { throw new InvalidFormPropertyException($formValidation->form); diff --git a/src/AuraInputModule.php b/src/AuraInputModule.php index 57846a5..3d9819a 100644 --- a/src/AuraInputModule.php +++ b/src/AuraInputModule.php @@ -19,6 +19,7 @@ use Ray\Di\AbstractModule; use Ray\Di\Scope; use Ray\WebFormModule\Annotation\FormValidation; +use Ray\WebFormModule\Annotation\InputValidation; class AuraInputModule extends AbstractModule { @@ -33,8 +34,14 @@ protected function configure() $this->bind(FilterInterface::class)->to(Filter::class); $this->bind(AntiCsrfInterface::class)->to(AntiCsrf::class)->in(Scope::SINGLETON); $this->bind(FailureHandlerInterface::class)->to(OnFailureMethodHandler::class); + $this->bind(FailureHandlerInterface::class)->annotatedWith('vnd_error')->to(VndErrorHandler::class)->in(Scope::SINGLETON); $this->bind(HelperLocatorFactory::class); $this->bind(FilterFactory::class); + $this->bindInterceptor( + $this->matcher->any(), + $this->matcher->annotatedWith(InputValidation::class), + [InputValidationInterceptor::class] + ); $this->bindInterceptor( $this->matcher->any(), $this->matcher->annotatedWith(FormValidation::class), diff --git a/src/FailureHandlerInterface.php b/src/FailureHandlerInterface.php index 2b91349..4e37b51 100644 --- a/src/FailureHandlerInterface.php +++ b/src/FailureHandlerInterface.php @@ -6,11 +6,10 @@ */ namespace Ray\WebFormModule; -use Aura\Input\Form; use Ray\Aop\MethodInvocation; -use Ray\WebFormModule\Annotation\FormValidation; +use Ray\WebFormModule\Annotation\AbstractValidation; interface FailureHandlerInterface { - public function handle(FormValidation $formValidation, MethodInvocation $invocation, AbstractForm $form); + public function handle(AbstractValidation $formValidation, MethodInvocation $invocation, AbstractForm $form); } diff --git a/src/InputValidationInterceptor.php b/src/InputValidationInterceptor.php new file mode 100644 index 0000000..e4d37c2 --- /dev/null +++ b/src/InputValidationInterceptor.php @@ -0,0 +1,29 @@ +reader = $reader; + $this->failureHandler = $handler; + } +} diff --git a/src/OnFailureMethodHandler.php b/src/OnFailureMethodHandler.php index f80469d..9d40a66 100644 --- a/src/OnFailureMethodHandler.php +++ b/src/OnFailureMethodHandler.php @@ -6,8 +6,8 @@ */ namespace Ray\WebFormModule; -use Aura\Input\Form; use Ray\Aop\MethodInvocation; +use Ray\WebFormModule\Annotation\AbstractValidation; use Ray\WebFormModule\Annotation\FormValidation; use Ray\WebFormModule\Exception\InvalidOnFailureMethod; @@ -16,13 +16,13 @@ final class OnFailureMethodHandler implements FailureHandlerInterface /** * {@inheritdoc} */ - public function handle(FormValidation $formValidation, MethodInvocation $invocation, AbstractForm $form) + public function handle(AbstractValidation $formValidation, MethodInvocation $invocation, AbstractForm $form) { unset($form); $args = (array) $invocation->getArguments(); $object = $invocation->getThis(); - if (! method_exists($object, $formValidation->onFailure)) { - throw new InvalidOnFailureMethod($formValidation->onFailure); + if (! $formValidation instanceof FormValidation || ! method_exists($object, $formValidation->onFailure)) { + throw new InvalidOnFailureMethod(get_class($invocation->getThis())); } return call_user_func_array([$invocation->getThis(), $formValidation->onFailure], $args); diff --git a/src/VndErrorHandler.php b/src/VndErrorHandler.php index cf32f1d..d72e5d2 100644 --- a/src/VndErrorHandler.php +++ b/src/VndErrorHandler.php @@ -6,10 +6,9 @@ */ namespace Ray\WebFormModule; -use Aura\Input\Form; use Doctrine\Common\Annotations\Reader; use Ray\Aop\MethodInvocation; -use Ray\WebFormModule\Annotation\FormValidation; +use Ray\WebFormModule\Annotation\AbstractValidation; use Ray\WebFormModule\Annotation\VndError; use Ray\WebFormModule\Exception\ValidationException; @@ -28,7 +27,7 @@ public function __construct(Reader $reader) /** * {@inheritdoc} */ - public function handle(FormValidation $formValidation, MethodInvocation $invocation, AbstractForm $form) + public function handle(AbstractValidation $formValidation, MethodInvocation $invocation, AbstractForm $form) { unset($formValidation); $vndError = $this->reader->getMethodAnnotation($invocation->getMethod(), VndError::class); diff --git a/tests/AbstractAuraFormTest.php b/tests/AbstractAuraFormTest.php index e8f30b3..ce5af04 100644 --- a/tests/AbstractAuraFormTest.php +++ b/tests/AbstractAuraFormTest.php @@ -2,10 +2,6 @@ namespace Ray\WebFormModule; -use Aura\Html\HelperLocatorFactory; -use Aura\Input\Builder; -use Aura\Input\Filter; - class AbstractAuraFormTest extends \PHPUnit_Framework_TestCase { /** diff --git a/tests/AbstractFormTest.php b/tests/AbstractFormTest.php index c520f29..5d5d893 100644 --- a/tests/AbstractFormTest.php +++ b/tests/AbstractFormTest.php @@ -97,5 +97,4 @@ public function testAntiCsrfViolation() $this->form->setAntiCsrf(new AntiCsrf($session, false)); $this->form->apply([]); } - } diff --git a/tests/AuraInputModuleTest.php b/tests/AuraInputModuleTest.php index a667feb..52e6dcd 100644 --- a/tests/AuraInputModuleTest.php +++ b/tests/AuraInputModuleTest.php @@ -4,6 +4,7 @@ use Ray\Aop\WeavedInterface; use Ray\Di\Injector; +use Ray\WebFormModule\Exception\ValidationException; class AuraInputModuleTest extends \PHPUnit_Framework_TestCase { @@ -28,7 +29,12 @@ public function testAuraInputModule() $this->assertInstanceOf(WeavedInterface::class, $controller); } - public function testFormModule() + public function testExceptionOnFailure() { + $this->setExpectedException(ValidationException::class); + $injector = new Injector(new FakeModule, __DIR__ . '/tmp'); + /** @var $controller FakeInputValidationController */ + $controller = $injector->getInstance(FakeInputValidationController::class); + $controller->createAction(''); } } diff --git a/tests/Fake/FakeInputValidationController.php b/tests/Fake/FakeInputValidationController.php new file mode 100644 index 0000000..0a8cefd --- /dev/null +++ b/tests/Fake/FakeInputValidationController.php @@ -0,0 +1,31 @@ +form1 = $form; + } + + /** + * @InputValidation(form="form1") + */ + public function createAction($name) + { + } +} From 70174219ab2dc7052ca4e4c0b4afbce535f8c0fa Mon Sep 17 00:00:00 2001 From: Akihito Koriyama Date: Wed, 16 Sep 2015 07:59:57 +0900 Subject: [PATCH 2/3] exclude tmp from .gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4ba03e6..59370d4 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,3 @@ build vendor/ composer.phar composer.lock -tmp/ From 46f77504728995aa0a8f267b4e124ef15f11c179 Mon Sep 17 00:00:00 2001 From: Akihito Koriyama Date: Wed, 16 Sep 2015 08:12:34 +0900 Subject: [PATCH 3/3] update README --- README.JA.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.JA.md b/README.JA.md index cdf1e09..634e625 100644 --- a/README.JA.md +++ b/README.JA.md @@ -144,6 +144,21 @@ class MyForm extends AbstractAuraForm ## Validation Exception +`@FormValidation`の代わりに`@InputValidation`とアノテートするとバリデーションが失敗したときに`Ray\WebFormModule\Exception\ValidationException`が投げられるよになります。この場合はHTML表現は使われません。Web APIアプリケーションなどに便利です。 + +```php +use Ray\WebFormModule\Annotation\InputValidation; + +class Foo +{ + /** + * @InputValidation(form="form1") + */ + public function createAction($name) + { + // ... + } +``` 以下のように `Ray\WebFormModule\FormVndErrorModule`をインストールするとフォームのバリデーションが失敗したときに`Ray\WebFormModule\Exception\ValidationException`例外が投げられるよになります。 ```php