diff --git a/src/Annotation/ElementAnnotationsListener.php b/src/Annotation/ElementAnnotationsListener.php index 54ac51b4..b7d4bf41 100644 --- a/src/Annotation/ElementAnnotationsListener.php +++ b/src/Annotation/ElementAnnotationsListener.php @@ -156,7 +156,8 @@ public function handleComposedObjectAnnotation(EventInterface $e): void if (! isset($inputFilter['type'])) { $inputFilter['type'] = InputFilter::class; } - $e->setParam('inputSpec', $inputFilter); + $inputSpec = $e->getParam('inputSpec'); + $inputSpec->exchangeArray($inputFilter); unset($specification['input_filter']); // Compose specification as a fieldset into parent form/fieldset diff --git a/test/Annotation/AbstractBuilderTestCase.php b/test/Annotation/AbstractBuilderTestCase.php index 6d74ea16..d12c604b 100644 --- a/test/Annotation/AbstractBuilderTestCase.php +++ b/test/Annotation/AbstractBuilderTestCase.php @@ -6,17 +6,23 @@ use ArrayObject; use Generator; +use Laminas\Filter\StringTrim; use Laminas\Form\Annotation; use Laminas\Form\Element; use Laminas\Form\Element\Collection; use Laminas\Form\Fieldset; use Laminas\Form\FieldsetInterface; +use Laminas\Form\InputFilterProviderFieldset; use Laminas\Hydrator\ClassMethodsHydrator; use Laminas\Hydrator\ObjectPropertyHydrator; use Laminas\InputFilter\Input; use Laminas\InputFilter\InputFilterInterface; use Laminas\InputFilter\InputInterface; use Laminas\Stdlib\PriorityList; +use Laminas\Validator\EmailAddress; +use Laminas\Validator\NotEmpty; +use Laminas\Validator\StringLength; +use Laminas\Validator\ValidatorChain; use LaminasTest\Form\TestAsset; use LaminasTest\Form\TestAsset\Annotation\Entity; use LaminasTest\Form\TestAsset\Annotation\Form; @@ -215,6 +221,28 @@ public function testAllowsComposingChildEntities(): void self::assertInstanceOf(InputFilterInterface::class, $composed); self::assertTrue($composed->has('username')); self::assertTrue($composed->has('password')); + $usernameInput = $composed->get('username'); + self::assertInstanceOf(Input::class, $usernameInput); + $validatorChain = $usernameInput->getValidatorChain(); + self::assertInstanceOf(ValidatorChain::class, $validatorChain); + $usernameValidators = $validatorChain->getValidators(); + self::assertCount(2, $usernameValidators); + self::assertInstanceOf(NotEmpty::class, $usernameValidators[0]['instance']); + self::assertInstanceOf(StringLength::class, $usernameValidators[1]['instance']); + $usernameFilters = $usernameInput->getFilterChain()->getFilters()->toArray(); + self::assertCount(1, $usernameFilters); + self::assertInstanceOf(StringTrim::class, $usernameFilters[0]); + + $passwordInput = $composed->get('password'); + self::assertInstanceOf(Input::class, $passwordInput); + $validatorChain = $passwordInput->getValidatorChain(); + $passwordValidators = $validatorChain->getValidators(); + self::assertCount(1, $passwordValidators); + self::assertInstanceOf(EmailAddress::class, $passwordValidators[0]['instance']); + + $passwordFilters = $passwordInput->getFilterChain()->getFilters()->toArray(); + self::assertCount(1, $passwordFilters); + self::assertInstanceOf(StringTrim::class, $passwordFilters[0]); } public function testAllowsComposingMultipleChildEntities(): void @@ -231,6 +259,47 @@ public function testAllowsComposingMultipleChildEntities(): void self::assertInstanceOf(FieldsetInterface::class, $target); self::assertTrue($target->has('username')); self::assertTrue($target->has('password')); + self::assertInstanceOf(InputFilterProviderFieldset::class, $target); + $filterSpec = $target->getInputFilterSpecification(); + self::assertArrayHasKey('username', $filterSpec); + self::assertArrayHasKey('password', $filterSpec); + $usernameFilterSpec = $filterSpec['username']; + self::assertEquals([ + 'name' => 'username', + 'error_message' => 'Invalid or missing username', + 'required' => 1, + 'filters' => [ + '0' => [ + 'name' => 'StringTrim', + ], + ], + 'validators' => [ + '0' => [ + 'name' => 'NotEmpty', + ], + 1 => [ + 'name' => 'StringLength', + 'options' => [ + 'min' => 3, + 'max' => 25, + ], + ], + ], + ], $usernameFilterSpec); + $passwordFilterSpec = $filterSpec['password']; + self::assertEquals([ + 'name' => 'password', + 'filters' => [ + '0' => [ + 'name' => 'StringTrim', + ], + ], + 'validators' => [ + '0' => [ + 'name' => 'EmailAddress', + ], + ], + ], $passwordFilterSpec); } /**