Compare commits

..

160 commits

Author SHA1 Message Date
a0488daa41 update structure of composer.json and update dependencies
All checks were successful
ci/woodpecker/tag/code-style Pipeline was successful
ci/woodpecker/tag/functional-tests/1 Pipeline was successful
ci/woodpecker/tag/functional-tests/2 Pipeline was successful
ci/woodpecker/tag/functional-tests/3 Pipeline was successful
ci/woodpecker/tag/functional-tests/4 Pipeline was successful
2024-10-11 14:30:45 +02:00
230677d289 Merge branch 'release/3.2.0'
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/functional-tests/1 Pipeline was successful
ci/woodpecker/push/functional-tests/2 Pipeline was successful
ci/woodpecker/tag/code-style Pipeline was successful
ci/woodpecker/push/functional-tests/3 Pipeline was successful
ci/woodpecker/push/functional-tests/4 Pipeline was successful
ci/woodpecker/tag/functional-tests/1 Pipeline was successful
ci/woodpecker/tag/functional-tests/2 Pipeline was successful
ci/woodpecker/tag/functional-tests/3 Pipeline was successful
ci/woodpecker/tag/functional-tests/4 Pipeline was successful
2024-09-04 16:05:13 +02:00
ad973f63ed Merge branch 'feature/conditional-validator' into develop
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/functional-tests/2 Pipeline was successful
ci/woodpecker/push/functional-tests/3 Pipeline was successful
ci/woodpecker/push/functional-tests/1 Pipeline was successful
ci/woodpecker/push/functional-tests/4 Pipeline was successful
* feature/conditional-validator:
  add feature comment
  improve tests
  fix handling of validation groups
  add conditional validator to allow more flexible configuration
  rewrite settings validator to support validators on first level ; deprecate "properties" and "self" level
2024-09-04 16:04:29 +02:00
1f5b491d5a add feature comment
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/functional-tests/1 Pipeline was successful
ci/woodpecker/push/functional-tests/2 Pipeline was successful
ci/woodpecker/push/functional-tests/3 Pipeline was successful
ci/woodpecker/push/functional-tests/4 Pipeline was successful
2024-09-04 15:59:15 +02:00
3b64e5b87b improve tests 2024-09-04 15:58:08 +02:00
cf710783d9 fix handling of validation groups 2024-09-04 15:57:55 +02:00
da4f409a8d add conditional validator to allow more flexible configuration
Some checks failed
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/functional-tests/1 Pipeline failed
ci/woodpecker/push/functional-tests/2 Pipeline failed
ci/woodpecker/push/functional-tests/3 Pipeline failed
ci/woodpecker/push/functional-tests/4 Pipeline failed
2024-08-30 14:47:28 +02:00
b86110a3b0 rewrite settings validator to support validators on first level ; deprecate "properties" and "self" level 2024-08-30 14:46:49 +02:00
04d1810bb2 Merge tag '3.1.1' into develop
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/functional-tests Pipeline was successful
Tagging 3.1.1
2023-02-19 00:01:04 +01:00
a3209c6976 Merge branch 'release/3.1.1'
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/functional-tests Pipeline was successful
2023-02-19 00:01:00 +01:00
f452efae74 Allow recent flow versions
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/functional-tests Pipeline was successful
2023-02-18 23:55:38 +01:00
a213057567 Merge branch 'version/2.x-dev' into develop
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/test Pipeline was successful
2022-10-27 12:39:50 +02:00
1e7a319604 Fixing code-style pipeline
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/test Pipeline was successful
2022-10-27 12:39:26 +02:00
Robin Krahnen
a94e3a3291 Merge branch 'release/3.1.0'
Some checks failed
ci/woodpecker/push/code-style Pipeline failed
ci/woodpecker/push/test Pipeline was successful
2022-05-04 23:41:58 +02:00
Robin Krahnen
09f6aa089b Merge tag '3.1.0' into develop
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/test Pipeline was successful
3.1.0
2022-05-04 23:41:58 +02:00
Robin Krahnen
0e5a09e45a optimized versions in composer.json
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/test Pipeline was successful
2022-05-04 19:01:14 +02:00
Robin Krahnen
0ad084f734 add "declare(strict_types=1);"
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/test Pipeline was successful
2022-05-02 09:56:09 +02:00
7c0c667dd3 Adjusting tests to support only Flow 6.3
Some checks failed
ci/woodpecker/push/code-style Pipeline failed
ci/woodpecker/push/test Pipeline failed
2022-04-30 18:40:25 +02:00
01bb260444 Merge remote-tracking branch 'origin/feature/drone-ci-tests' into feature/drone-ci-tests-develop 2022-04-30 18:38:50 +02:00
eff9a13d22 Merge pull request 'feature/drone-ci-tests' (#1) from fkuhl/DigiComp.SettingValidator:feature/drone-ci-tests into feature/drone-ci-tests
All checks were successful
ci/woodpecker/push/code-style Pipeline was successful
ci/woodpecker/push/test Pipeline was successful
Reviewed-on: #1
2022-04-30 18:36:20 +02:00
1d09aeeced Adding Flow 4.3 build
All checks were successful
ci/woodpecker/pr/code-style Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
2022-04-30 18:22:11 +02:00
25d5a3c21f Basing functional test build on base distribution
All checks were successful
ci/woodpecker/pr/code-style Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
2022-04-30 15:16:28 +02:00
6beb9f1997 Merge branch 'feature/drone-ci-tests' into feature/drone-ci-tests-develop 2022-04-29 03:07:45 +02:00
2162238cc6 Only code-style
Some checks failed
ci/woodpecker/pr/code-style Pipeline was successful
ci/woodpecker/pr/test Pipeline failed
2022-04-29 03:02:36 +02:00
bd503834d7 adding functional test 2022-04-29 01:47:02 +02:00
86cf0c546b adding code-style pipeline
Some checks failed
ci/woodpecker/push/code-style Pipeline failed
2022-04-28 22:49:56 +02:00
Robin Krahnen
1fd6480cd2 revised code 2022-04-20 17:36:29 +02:00
Robin Krahnen
c09b13c124 optimized code from tests 2022-04-04 22:36:48 +02:00
Robin Krahnen
fb9f31ccee optimized code from code migrations 2022-04-04 22:29:30 +02:00
Robin Krahnen
3087390299 reorder entries in Validation.yaml 2022-03-03 14:25:17 +01:00
Robin Krahnen
d4e095dd54 optimized php requirement 2022-03-03 13:30:50 +01:00
Robin Krahnen
9707c47a1c optimized Package.php 2021-10-06 15:58:48 +02:00
Robin Krahnen
9c4138b4d1 added return type hints for callables 2021-09-23 09:52:07 +02:00
Robin Krahnen
51115825ac add empty line at end of License.txt 2021-09-22 15:00:26 +02:00
Robin Krahnen
26a71d266d update composer.json 2021-09-02 17:50:15 +02:00
Robin Krahnen
c4c3d94fd9 Merge branch 'develop' 2021-04-14 10:57:43 +02:00
Robin Krahnen
ba7e6ce33f code style changes 2021-04-13 08:51:04 +02:00
Robin Krahnen
a1882a2b11 optimized CHANGELOG.md 2021-03-15 19:57:44 +01:00
Robin Krahnen
d03d940f6a optimized CHANGELOG.md 2021-03-15 19:47:22 +01:00
Robin Krahnen
3fab89e54b Merge branch 'develop' 2021-02-17 14:40:53 +01:00
Robin Krahnen
bd7fca349c reorder composer.json 2021-02-17 14:40:35 +01:00
Robin Krahnen
75101c2147 fixed branch alias 2021-02-17 13:56:00 +01:00
Robin Krahnen
f857055059 update required versions 2021-02-17 09:01:00 +01:00
Robin Krahnen
591886bfdf optimized README.md 2021-02-16 12:47:06 +01:00
Robin Krahnen
20cf7bff05 use double quotes in yaml files 2021-02-16 11:19:51 +01:00
Robin Krahnen
9610c2a27e Merge branch 'develop' 2021-01-11 17:07:25 +01:00
Robin Krahnen
b01aa11242 optimized composer.json 2021-01-11 17:00:12 +01:00
Robin Krahnen
e5aed7a587 Merge branch 'develop' 2020-09-09 10:49:33 +02:00
Robin Krahnen
c5e511fecc raise required version of neos/flow to 6.3 2020-09-09 10:47:24 +02:00
Robin Krahnen
eada129ce9 Merge branch 'develop' 2020-08-31 13:50:13 +02:00
Robin Krahnen
3426886a56 Merge branch 'feature/flow_6.x' into develop 2020-08-31 13:44:06 +02:00
Robin Krahnen
849c87ce6f changed date 2020-08-31 13:42:10 +02:00
Robin Krahnen
ba6f572cec added CHANGELOG.md 2020-08-30 21:58:08 +02:00
Robin Krahnen
82a68be97d added empty line at end of composer.json 2020-08-28 14:53:43 +02:00
Robin Krahnen
42cefc7ced added branch aliases 2020-08-28 14:52:30 +02:00
Robin Krahnen
1775021854 TASK: Apply migration Neos.Flow-20190515215000
Adjust "Settings.yaml" to new PSR-3 logging settings (see
https://github.com/neos/flow-development-collection/pull/1574)

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2020-08-28 11:22:41 +02:00
Robin Krahnen
5437fb29bd TASK: Apply migration Neos.Flow-20190425144900
Adjusts code to FlashMessageContainer renaming from "\Neos\Flow\Mvc" to
"\Neos\Flow\Mvc\FlashMessage".

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2020-08-28 11:22:40 +02:00
Robin Krahnen
5ab1085590 update required version of neos/flow 2020-08-28 11:06:06 +02:00
Robin Krahnen
937e74671c code style 2020-08-19 13:56:55 +02:00
Robin Krahnen
651f5815a4 remove unused import 2020-08-10 13:47:28 +02:00
Robin Krahnen
e311c202bc update to newest standard 2020-07-22 17:22:46 +02:00
Robin Krahnen
efdb8560a1 reorder attributes 2020-05-14 14:47:33 +02:00
Robin Krahnen
8c9790b662 optimized code 2020-05-14 14:43:48 +02:00
Robin Krahnen
0de085c5cf optimized migration 2020-05-14 14:43:25 +02:00
Robin Krahnen
ca1ec5707f added missing @throws 2020-05-14 14:43:09 +02:00
Robin Krahnen
c6e7d549c1 reorder lines 2020-05-13 10:20:20 +02:00
Robin Krahnen
bb8ec70593 added neos package key 2020-05-13 10:19:26 +02:00
Robin Krahnen
8f6fbf9058 use neos/flow ^6.2 and php ~7.4.0 2020-05-13 10:05:30 +02:00
Robin Krahnen
8eea5e9b15 optimize error message 2020-05-13 09:48:43 +02:00
Robin Krahnen
f33647559a optimized condition 2020-05-13 09:47:41 +02:00
Robin Krahnen
a81c1bfe35 update README.md 2020-05-04 23:27:47 +02:00
Robin Krahnen
000c301d25 remove .gitignore 2020-05-04 23:13:06 +02:00
Robin Krahnen
c6e23fdf35 code guideline 2020-05-04 23:07:52 +02:00
Robin Krahnen
272f78f96e optimize code 2020-05-04 23:05:55 +02:00
Robin Krahnen
e4abe5a96c reformat code 2020-05-04 22:26:58 +02:00
Robin Krahnen
72904639a4 reformat code 2020-05-04 22:23:54 +02:00
Robin Krahnen
362b37b6d6 added property types 2020-05-04 22:19:37 +02:00
Robin Krahnen
8d76072227 remove unnecessary reference 2020-05-04 22:10:46 +02:00
Robin Krahnen
e141dbddee replaced static with self 2020-05-04 22:09:37 +02:00
Robin Krahnen
f20c3ba090 added missing visibility to constant 2020-05-04 22:05:16 +02:00
Robin Krahnen
8cc705bd48 remove unnecessary references 2020-05-04 22:04:15 +02:00
Robin Krahnen
743ec61c44 simplify function handleValidationGroups 2020-05-04 22:02:12 +02:00
Robin Krahnen
08e6ad00d4 use existing constant for configuration type 2020-05-04 22:01:48 +02:00
Robin Krahnen
8b0e5640b9 replace use getter instead of directly accessing no longer protected variable 2020-05-04 21:57:03 +02:00
Robin Krahnen
d30ed3310a remove deprecated parts 2020-04-30 08:19:57 +02:00
Robin Krahnen
00f7e385d9 require newer neos/flow 2020-04-29 15:34:23 +02:00
Robin Krahnen
72789243f0 empty line between opening php tag and namespace 2020-03-16 15:44:36 +01:00
Robin Krahnen
c528658f82 optimize code migrations 2020-03-16 15:41:30 +01:00
Robin Krahnen
20e891ac91 removed empty lines between @param and @return/@throws 2020-03-12 14:21:30 +01:00
Robin Krahnen
befaf99d9f removed trailing spaces 2020-03-11 12:09:37 +01:00
Robin Krahnen
e8c94b15a1 replaces tabs with spaces 2020-03-11 12:00:42 +01:00
Robin Krahnen
87544c3976 write strings in yaml files in quotes 2020-03-11 10:39:33 +01:00
Robin Krahnen
a73f3545ea Merge branch 'develop' 2020-03-10 14:53:58 +01:00
Robin Krahnen
11425866a1 PSR-12 for tests 2020-03-10 14:48:57 +01:00
Robin Krahnen
2bbebd9419 PSR-12 2020-03-10 14:35:24 +01:00
Robin Krahnen
5f77512296 added blank space before namespace line (PSR-12) 2020-03-10 11:13:10 +01:00
Robin Krahnen
df77fcf75a Merge branch 'develop' 2019-12-04 12:53:16 +01:00
Christian Krause
8b4bf2b09b Merge tag '2.1.0' into develop
2.1.0
2019-11-12 12:35:21 +01:00
Christian Krause
d16ca767c1 Merge branch 'release/2.1.0' 2019-11-12 12:35:21 +01:00
Christian Krause
40aaaa930b Merge branch 'feature/flow-5.3' into develop 2019-11-12 12:35:03 +01:00
Robin Krahnen
6fa2343816 Merge branch 'develop' into feature/flow-5.3 2019-10-28 10:55:21 +01:00
Robin Krahnen
c721f78f08 added @deprecated to unused properties 2019-10-28 10:31:10 +01:00
Robin Krahnen
5e5c6bfb9d Merge branch 'develop' into feature/flow-5.3 2019-10-02 14:34:07 +02:00
Robin Krahnen
14a6ebbd00 TASK: Apply migration Neos.Flow-20180415105700
Add scalar type hint to CacheAwareInterface implementations.

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2019-08-27 11:30:13 +02:00
Robin Krahnen
4dd8d9026b Merge branch 'develop' 2019-08-20 15:13:50 +02:00
Robin Krahnen
3cac00f12a remove unnecessary @Flow\Scope("prototype") 2019-07-30 11:02:25 +02:00
409efffe45 TASK: Allow Flow 5.3 2019-06-24 16:00:19 +02:00
Robin Krahnen
1d27166706 optimized spaces in readme 2019-06-07 09:02:40 +02:00
9c09eacaea Merge tag '2.0.3' into develop
Tagging 2.0.3
2019-01-28 11:49:48 +01:00
0f9c5f4697 Merge branch 'release/2.0.3' 2019-01-28 11:49:44 +01:00
4a6d344ab6 FIX: Do not migrate already migrated validators 2019-01-28 11:37:18 +01:00
Robin Krahnen
4228053b3f optimized Package.php 2019-01-28 11:19:02 +01:00
Robin Krahnen
daeace6a2e added missing types for @param annotation 2018-11-08 15:41:53 +01:00
Robin Krahnen
6e3158e9d6 use '=' instead of ':' als delimiter between key and value in annotation options 2018-11-07 17:19:04 +01:00
Robin Krahnen
41df85d9b1 small code optimizations 2018-10-24 16:19:20 +02:00
Robin Krahnen
187c9e1c25 Merge branch 'release/2.0.2' 2018-08-06 16:24:59 +02:00
Robin Krahnen
404105eaa8 Merge tag '2.0.2' into develop
2.0.2
2018-08-06 16:24:59 +02:00
Robin Krahnen
8b9da3197e use empty() instead of count() 2018-05-30 17:15:06 +02:00
2ca4e6e6ae Merge tag '2.0.1' into develop
Tagging 2.0.1
2018-05-14 14:59:41 +02:00
5eca8b80fb Merge branch 'release/2.0.1' 2018-05-14 14:59:36 +02:00
Robin Krahnen
2443564272 remove unused imports 2018-04-05 10:28:15 +02:00
Robin Krahnen
ab79cc0e14 replaced doctype annotation in methods with comment 2018-04-05 09:02:15 +02:00
Robin Krahnen
6922dba2a9 add quotes around strings in YAML files 2018-04-03 17:53:57 +02:00
Robin Krahnen
aaeb2d5c7f just some annotation cleanup 2018-04-03 10:29:06 +02:00
f3dcab421c Merge tag '2.0.0' into develop
Tagging 2.0.0
2017-09-04 18:38:15 +02:00
ff343cd8a2 Merge branch 'master' of ssh://digital-competence.de/Packages/DigiComp.SettingValidator 2017-09-04 16:47:24 +02:00
26e996e2f7 Merge branch 'version/1.x' into develop 2017-09-04 16:46:17 +02:00
Merten Koch
3ba6b33f0a Merge branch 'release/3.0.0' 2017-08-28 16:29:54 +02:00
Merten Koch
b0fe0be425 Merge branch 'feature/neos-flow4' into develop 2017-08-28 16:29:27 +02:00
Daniel Siepmann
a31595513f
TASK: Reformat to follow CGL 2017-07-19 12:55:31 +02:00
Daniel Siepmann
2b41d5f3db
BUGFIX: Fix broken recursion with validation groups
Provide current validation group for recursive SettingsValidator.
Adjust test.
Provide configuration to outline the issue.
2017-07-19 12:54:29 +02:00
Daniel Siepmann
5c927e9dda
BUGFIX: Only unset array key if it exists 2017-07-19 10:31:01 +02:00
Daniel Siepmann
3da68c2e49
TASK: Fix ValidationGroups
Fix handling of validation groups. Also added test to cover the feature.
2017-07-03 10:11:18 +02:00
eccc2b1bdd MERGE: Bringing the ValidationGroup feature back to work.
- ugly: they get extracted from options, as I do not see any other
  possibility
2017-06-29 21:34:20 +02:00
f0e31dcc11 Merge branch 'feature/newValidationYamlLayout' into feature/neos-flow4 2017-06-29 21:33:19 +02:00
Daniel Siepmann
e5b5f08153
FEATURE: Support validation groups as done by flow itself.
* Provide another option validationGroups.
* Allow each validation entry to be executed only for matching
  validation groups.
* Necessary for the same reason as documented in flow documentation. It
  should be possible to execute different validation rules for the same
  name or class, only at some points, e.g. at a specific action.
2017-06-21 11:26:13 +02:00
d83c009b28 TASK: taming complexity 2017-06-03 14:11:13 +02:00
4534099d3a TASK: Added code migration for Validation.yaml structure 2017-06-03 12:56:14 +02:00
9a055a2f77 TASK: Completely changing the layout of Validation.yaml 2017-06-02 23:14:05 +02:00
40fc82e515 TASK: Add basic functional tests 2017-06-02 21:58:33 +02:00
93fa97e817 TASK: Migrate to PSR-4 2017-06-02 21:18:27 +02:00
Daniel Siepmann
8dfb72c230
TASK: Raise flow version constraint 2017-05-24 14:02:27 +02:00
5c2a5babdd TASK: Updating dependencies 2017-04-03 17:05:47 +02:00
Daniel Siepmann
30adb0f7cc TASK: Apply migration Neos.Flow-20170127183102
Migrate bootstep names.

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
610a89bfaf TASK: Apply migration Neos.Flow-20170125103800
Migrate usages of the path [TYPO3][Flow][Security][Authentication] to
[Neos][Flow][Security][Authentication]

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
55352da4d6 TASK: Apply migration Neos.Media-20161219094126
Migrate name for the media image size cache

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
d24fefeda4 TASK: Apply migration TYPO3.FluidAdaptor-20161130112935
Adjusts code to package renaming from "TYPO3.Fluid" to
"Neos.FluidAdaptor".

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
9e980e40e1 TASK: Apply migration Neos.SwiftMailer-20161130105617
Adjusts code to package renaming from "TYPO3.SwiftMailer" to
"Neos.SwiftMailer".

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
6855634a80 TASK: Apply migration Neos.Flow-20161125124112
Adjusts code to Neos\Flow\Utility\Unicode adjustment

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
5120239c12 TASK: Apply migration Neos.Media-20161124233100
Adjusts code to package renaming from "TYPO3.Media" to "Neos.Media"

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
22e060163f TASK: Apply migration Neos.Imagine-20161124231742
Adjusts code to Imagine Renaming

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
365ed39776 TASK: Apply migration Neos.Eel-20161124230101
Adjusts code to Eel Renaming

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
2fc3edd6c0 TASK: Apply migration Neos.Flow-20161124224015
Adjusts code to cache extraction

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
e36874e26d TASK: Apply migration Neos.Flow-20161124204701
Adjusts code to package renaming from "Neos.Flow.Utility.Files" to
"Neos.Utility.Files" and other extractions of the "Utility" packages.

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
85174f7489 TASK: Apply migration Neos.Flow-20161124204700
Adjusts code to package renaming from "TYPO3.Flow" to "Neos.Flow"

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
0e7d19b3cd TASK: Apply migration TYPO3.Flow-20161115140430
Adjust to the renaming of the Object namespace in Flow 4.0

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
2b9b1febe9 TASK: Apply migration TYPO3.Flow-20161115140400
Adjust to the renaming of the Resource namespace and class in Flow 4.0

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:45 +01:00
Daniel Siepmann
5c44ad5579 TASK: Apply migration TYPO3.Flow-20151113161300
Adjust "Settings.yaml" to new "requestPattern" and "firewall" syntax
(see FLOW-412)

Note: This migration did not produce any changes, so the commit simply
marks the migration as applied. This makes sure it will not be applied
again.
2017-03-15 09:06:44 +01:00
Robin Krahnen
baa35e0926 update project; fit neos/flow 4 2017-03-13 17:00:13 +01:00
Robin Krahnen
9531b7af46 edit composer.json for feature/neos-flow4 2017-03-04 17:29:20 +01:00
20 changed files with 1086 additions and 192 deletions

1
.gitignore vendored
View file

@ -1 +0,0 @@
.svn

View file

@ -0,0 +1,8 @@
pipeline:
code-style:
image: composer
commands:
- composer global config repositories.repo-name vcs https://git.digital-competence.de/Packages/php-codesniffer
- composer global config --no-plugins allow-plugins.dealerdirect/phpcodesniffer-composer-installer true
- composer global require digicomp/php-codesniffer:@dev
- composer global exec -- phpcs --runtime-set ignore_warnings_on_exit 1 --standard=DigiComp Classes/ Migrations/ Tests/ Resources/Private/

View file

@ -0,0 +1,32 @@
workspace:
base: /woodpecker
path: package
matrix:
include:
- FLOW_VERSION: 6.3
PHP_VERSION: 7.4
- FLOW_VERSION: 7.3
PHP_VERSION: 7.4
- FLOW_VERSION: 7.3
PHP_VERSION: 8.2
- FLOW_VERSION: 8.2
PHP_VERSION: 8.2
pipeline:
functional-tests:
image: thecodingmachine/php:${PHP_VERSION}-v4-cli
environment:
# Enable the PDO_SQLITE extension
- "PHP_EXTENSION_PDO_SQLITE=1"
- "FLOW_VERSION=${FLOW_VERSION}"
- "NEOS_BUILD_DIR=/woodpecker/Build-${FLOW_VERSION}"
commands:
- "sudo mkdir $NEOS_BUILD_DIR"
- "sudo chown -R docker:docker $NEOS_BUILD_DIR"
- "cd $NEOS_BUILD_DIR"
- "composer create-project --no-install neos/flow-base-distribution:^$FLOW_VERSION ."
- "composer config repositories.repo-name path /woodpecker/package"
- "composer remove --dev --no-update neos/behat || composer remove --no-update neos/behat"
- "composer require digicomp/settingvalidator:@dev"
- "bin/phpunit --configuration Build/BuildEssentials/PhpUnit/FunctionalTests.xml Packages/Application/DigiComp.SettingValidator/Tests/Functional"

14
CHANGELOG.md Normal file
View file

@ -0,0 +1,14 @@
# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [3.0.1] - 2020-09-09
### Changed
- dependency to Flow ^6.3
## [3.0.0] - 2020-08-31
Start of the changelog.

View file

@ -1,33 +0,0 @@
<?php
namespace DigiComp\SettingValidator;
use Doctrine\ORM\Mapping as ORM;
use TYPO3\Flow\Annotations as Flow;
use TYPO3\Flow\Configuration\ConfigurationManager;
use TYPO3\Flow\Core\Bootstrap;
use \TYPO3\Flow\Package\Package as BasePackage;
/**
* @Flow\Scope("prototype")
*/
class Package extends BasePackage
{
public function boot(Bootstrap $bootstrap)
{
parent::boot($bootstrap);
$dispatcher = $bootstrap->getSignalSlotDispatcher();
$dispatcher->connect(
'TYPO3\Flow\Configuration\ConfigurationManager',
'configurationManagerReady',
function (ConfigurationManager $configurationManager) {
$configurationManager->registerConfigurationType(
'Validation',
ConfigurationManager::CONFIGURATION_PROCESSING_TYPE_DEFAULT,
true
);
}
);
}
}

View file

@ -1,96 +0,0 @@
<?php
namespace DigiComp\SettingValidator\Validation\Validator;
use Doctrine\ORM\Mapping as ORM;
use TYPO3\Flow\Annotations as Flow;
use TYPO3\Flow\Configuration\ConfigurationManager;
use TYPO3\Flow\Reflection\ObjectAccess;
use TYPO3\Flow\Reflection\ReflectionService;
use TYPO3\Flow\Validation\Exception\InvalidValidationConfigurationException;
use TYPO3\Flow\Validation\Exception\InvalidValidationOptionsException;
use TYPO3\Flow\Validation\Validator\AbstractValidator;
use TYPO3\Flow\Validation\ValidatorResolver;
/**
* Validator resolving other Validators defined in Validation.yaml
*
* @Flow\Scope("prototype")
*/
class SettingsValidator extends AbstractValidator
{
/**
* @var ValidatorResolver
* @Flow\Inject
*/
protected $validatorResolver;
/**
* @var array
*/
protected $validations;
/**
* @var \TYPO3\Flow\Configuration\ConfigurationManager
*/
protected $configurationManager;
public function injectConfigurationManager(ConfigurationManager $configurationManager)
{
$this->configurationManager = $configurationManager;
$this->validations = $this->configurationManager->getConfiguration('Validation');
}
/**
* @var ReflectionService
* @Flow\Inject
*/
protected $reflectionService;
protected $supportedOptions = array(
'name' => array('', 'Set the name of the setting-array to use', 'string', false)
);
/**
* Check if $value is valid. If it is not valid, needs to add an error
* to Result.
*
* @param mixed $value
*
* @throws InvalidValidationOptionsException
* @throws InvalidValidationConfigurationException
*/
protected function isValid($value)
{
$name = $this->options['name'] ? $this->options['name'] : $this->reflectionService->getClassNameByObject(
$value
);
if (!isset($this->validations[$name])) {
throw new InvalidValidationOptionsException(
'The name ' . $name . ' has not been defined in Validation.yaml!',
1397821438
);
}
$config = &$this->validations[$name];
foreach ($config as $validatorConfig) {
$validator = $this->validatorResolver->createValidator(
$validatorConfig['validator'],
$validatorConfig['options']
);
if (!$validator) {
throw new InvalidValidationConfigurationException(
'Validator could not be resolved: ' .
$validatorConfig['validator'] . '. Check your Validation.yaml',
1402326139
);
}
if (isset($validatorConfig['property'])) {
$this->result->forProperty($validatorConfig['property'])->merge(
$validator->validate(ObjectAccess::getPropertyPath($value, $validatorConfig['property']))
);
} else {
$this->result->merge($validator->validate($value));
}
}
}
}

43
Classes/Package.php Normal file
View file

@ -0,0 +1,43 @@
<?php
declare(strict_types=1);
namespace DigiComp\SettingValidator;
/*
* This file is part of the DigiComp.SettingValidator package.
*
* (c) digital competence
*
* This package is Open Source Software. For the full copyright and license
* information, please view the LICENSE file which was distributed with this
* source code.
*/
use Neos\Flow\Configuration\ConfigurationManager;
use Neos\Flow\Core\Bootstrap;
use Neos\Flow\Package\Package as NeosFlowPackagePackage;
/**
* Package base class of the DigiComp.SettingValidator package.
*/
class Package extends NeosFlowPackagePackage
{
/**
* @inheritDoc
*/
public function boot(Bootstrap $bootstrap): void
{
parent::boot($bootstrap);
$dispatcher = $bootstrap->getSignalSlotDispatcher();
$dispatcher->connect(
ConfigurationManager::class,
'configurationManagerReady',
function (ConfigurationManager $configurationManager): void {
$configurationManager->registerConfigurationType('Validation');
}
);
}
}

View file

@ -0,0 +1,152 @@
<?php
declare(strict_types=1);
namespace DigiComp\SettingValidator\Validation\Validator;
/*
* This file is part of the DigiComp.SettingValidator package.
*
* (c) digital competence
*
* This package is Open Source Software. For the full copyright and license
* information, please view the LICENSE file which was distributed with this
* source code.
*/
use Neos\Eel\EelEvaluatorInterface;
use Neos\Eel\Exception as NeosEelException;
use Neos\Eel\Utility;
use Neos\Flow\Annotations as Flow;
use Neos\Flow\ObjectManagement\DependencyInjection\DependencyProxy;
use Neos\Flow\Validation\Exception\InvalidValidationConfigurationException;
use Neos\Flow\Validation\Exception\NoSuchValidatorException;
use Neos\Flow\Validation\Validator\AbstractValidator;
use Neos\Flow\Validation\ValidatorResolver;
class ConditionalValidator extends AbstractValidator
{
/**
* @Flow\Inject
* @var EelEvaluatorInterface
*/
protected $eelEvaluator;
/**
* @Flow\Inject
* @var ValidatorResolver
*/
protected $validatorResolver;
/**
* @inheritDoc
*/
protected $supportedOptions = [
'conditions' => [[], 'List of entries with "condition" (eel expression) and "validators" (list of validators).', 'array', true],
'fallbackValidators' => [[], 'List of validators that is used if no condition matched.', 'array'],
'validationGroups' => [['Default'], 'Same as "Validation Groups" of Flow Framework', 'array'],
];
/**
* @inheritDoc
* @throws InvalidValidationConfigurationException
* @throws NeosEelException
* @throws NoSuchValidatorException
*/
protected function isValid($value): void
{
$validatorConfigs = [];
$hasMatch = false;
foreach ($this->options['conditions'] as $condition) {
if ($this->eelEvaluator instanceof DependencyProxy) {
$this->eelEvaluator->_activateDependency();
}
if (!Utility::evaluateEelExpression($condition['condition'], $this->eelEvaluator, ['this' => $value])) {
continue;
}
$hasMatch = true;
foreach ($condition['validators'] as $validator => $options) {
if ($options === null) {
continue;
}
$validatorConfigs[] = [
'validator' => $validator,
'options' => $options,
];
}
}
if (!$hasMatch) {
foreach ($this->options['fallbackValidators'] as $validator => $options) {
if ($options === null) {
continue;
}
$validatorConfigs[] = [
'validator' => $validator,
'options' => $options,
];
}
}
foreach ($validatorConfigs as $validatorConfig) {
if (!$this->doesValidationGroupsMatch($validatorConfig)) {
continue;
}
$this->handleValidationGroups($validatorConfig);
$validator = $this->validatorResolver->createValidator(
$validatorConfig['validator'],
$validatorConfig['options']
);
if ($validator === null) {
throw new InvalidValidationConfigurationException(
\sprintf(
'Validator "%s" could not be resolved. Check your Validation.yaml',
$validatorConfig['validator']
),
1402326139
);
}
$this->getResult()->merge($validator->validate($value));
}
}
/**
* Check whether at least one configured group does match, if any is configured.
*
* @param array $validatorConfig
* @return bool
*/
protected function doesValidationGroupsMatch(array $validatorConfig): bool
{
return !isset($validatorConfig['options']['validationGroups'])
|| \array_intersect(
$validatorConfig['options']['validationGroups'],
$this->options['validationGroups']
) !== [];
}
/**
* Add validation groups for recursion if necessary.
*
* @param array $validatorConfig
*/
protected function handleValidationGroups(array &$validatorConfig): void
{
if (\in_array($validatorConfig['validator'], ['DigiComp.SettingValidator:Settings', 'DigiComp.SettingValidator:Conditional', 'DigiComp.SettingValidator:Properties', 'Neos.Flow:Collection'])) {
$validatorConfig['options']['validationGroups'] = $this->options['validationGroups'];
} elseif (isset($validatorConfig['options']['validationGroups'])) {
unset($validatorConfig['options']['validationGroups']);
}
}
}

View file

@ -0,0 +1,119 @@
<?php
declare(strict_types=1);
namespace DigiComp\SettingValidator\Validation\Validator;
/*
* This file is part of the DigiComp.SettingValidator package.
*
* (c) digital competence
*
* This package is Open Source Software. For the full copyright and license
* information, please view the LICENSE file which was distributed with this
* source code.
*/
use Neos\Flow\Annotations as Flow;
use Neos\Flow\Validation\Exception\InvalidValidationConfigurationException;
use Neos\Flow\Validation\Exception\NoSuchValidatorException;
use Neos\Flow\Validation\Validator\AbstractValidator;
use Neos\Flow\Validation\ValidatorResolver;
use Neos\Utility\ObjectAccess;
class PropertiesValidator extends AbstractValidator
{
/**
* @Flow\Inject
* @var ValidatorResolver
*/
protected $validatorResolver;
/**
* @inheritDoc
*/
protected $supportedOptions = [
'validatorsForProperties' => [[], 'List of validators for properties. ', 'array', true],
'validationGroups' => [['Default'], 'Same as "Validation Groups" of Flow Framework', 'array'],
];
/**
* @inheritDoc
* @throws InvalidValidationConfigurationException
* @throws NoSuchValidatorException
*/
protected function isValid($value): void
{
$validatorConfigs = [];
foreach ($this->options['validatorsForProperties'] as $property => $validators) {
foreach ($validators as $validator => $options) {
if ($options === null) {
continue;
}
$validatorConfigs[] = [
'validator' => $validator,
'options' => $options,
'property' => $property,
];
}
}
foreach ($validatorConfigs as $validatorConfig) {
if (!$this->doesValidationGroupsMatch($validatorConfig)) {
continue;
}
$this->handleValidationGroups($validatorConfig);
$validator = $this->validatorResolver->createValidator(
$validatorConfig['validator'],
$validatorConfig['options']
);
if ($validator === null) {
throw new InvalidValidationConfigurationException(
\sprintf(
'Validator "%s" could not be resolved. Check your Validation.yaml',
$validatorConfig['validator']
),
1402326139
);
}
$this->getResult()->forProperty($validatorConfig['property'])->merge(
$validator->validate(ObjectAccess::getPropertyPath($value, $validatorConfig['property']))
);
}
}
/**
* Check whether at least one configured group does match, if any is configured.
*
* @param array $validatorConfig
* @return bool
*/
protected function doesValidationGroupsMatch(array $validatorConfig): bool
{
return !isset($validatorConfig['options']['validationGroups'])
|| \array_intersect(
$validatorConfig['options']['validationGroups'],
$this->options['validationGroups']
) !== [];
}
/**
* Add validation groups for recursion if necessary.
*
* @param array $validatorConfig
*/
protected function handleValidationGroups(array &$validatorConfig): void
{
if (\in_array($validatorConfig['validator'], ['DigiComp.SettingValidator:Settings', 'DigiComp.SettingValidator:Conditional', 'DigiComp.SettingValidator:Properties', 'Neos.Flow:Collection'])) {
$validatorConfig['options']['validationGroups'] = $this->options['validationGroups'];
} elseif (isset($validatorConfig['options']['validationGroups'])) {
unset($validatorConfig['options']['validationGroups']);
}
}
}

View file

@ -0,0 +1,160 @@
<?php
declare(strict_types=1);
namespace DigiComp\SettingValidator\Validation\Validator;
/*
* This file is part of the DigiComp.SettingValidator package.
*
* (c) digital competence
*
* This package is Open Source Software. For the full copyright and license
* information, please view the LICENSE file which was distributed with this
* source code.
*/
use Neos\Flow\Annotations as Flow;
use Neos\Flow\Validation\Exception\InvalidValidationConfigurationException;
use Neos\Flow\Validation\Exception\InvalidValidationOptionsException;
use Neos\Flow\Validation\Exception\NoSuchValidatorException;
use Neos\Flow\Validation\Validator\AbstractValidator;
use Neos\Flow\Validation\ValidatorResolver;
use Neos\Utility\TypeHandling;
/**
* Validator resolving other Validators defined in Validation.yaml
*/
class SettingsValidator extends AbstractValidator
{
/**
* @Flow\Inject
* @var ValidatorResolver
*/
protected $validatorResolver;
/**
* @Flow\InjectConfiguration(type="Validation")
* @var array
*/
protected array $validations;
/**
* @inheritDoc
*/
protected $supportedOptions = [
'name' => ['', 'Name of the setting array to use', 'string'],
'validationGroups' => [['Default'], 'Same as "Validation Groups" of Flow Framework', 'array'],
];
/**
* @inheritDoc
* @throws InvalidValidationOptionsException
* @throws InvalidValidationConfigurationException
* @throws NoSuchValidatorException
*/
protected function isValid($value): void
{
$validations = $this->validations;
// TODO: feature idea - we could extend the library to automatically be part of the base conjunction validator
$name = $this->options['name'] !== '' ? $this->options['name'] : TypeHandling::getTypeForValue($value);
if (!isset($validations[$name])) {
throw new InvalidValidationOptionsException(
'The name "' . $name . '" has not been defined in Validation.yaml!',
1397821438
);
}
// @deprecated - converts old "self" to new structure
if (isset($validations[$name]['self'])) {
foreach ($validations[$name]['self'] as $validator => $options) {
if (isset($validations[$name][$validator])) {
throw new \RuntimeException('The validator "' . $validator . '" is already defined on parent level.', 1725000364);
}
$validations[$name][$validator] = $options;
}
unset($validations[$name]['self']);
}
// @deprecated - converts old "properties" to new structure
if (isset($validations[$name]['properties'])) {
if (isset($validations[$name]['DigiComp.SettingValidator:Properties'])) {
throw new \RuntimeException('The validator "DigiComp.SettingValidator:Properties" is already defined on parent level.', 1725000396);
}
$validations[$name]['DigiComp.SettingValidator:Properties'] = [
'validatorsForProperties' => $validations[$name]['properties'],
];
unset($validations[$name]['properties']);
}
$validatorConfigs = [];
foreach ($validations[$name] as $validator => $options) {
if ($options === null) {
continue;
}
$validatorConfigs[] = [
'validator' => $validator,
'options' => $options,
];
}
foreach ($validatorConfigs as $validatorConfig) {
if (!$this->doesValidationGroupsMatch($validatorConfig)) {
continue;
}
$this->handleValidationGroups($validatorConfig);
$validator = $this->validatorResolver->createValidator(
$validatorConfig['validator'],
$validatorConfig['options']
);
if ($validator === null) {
throw new InvalidValidationConfigurationException(
\sprintf(
'Validator "%s" could not be resolved. Check your Validation.yaml',
$validatorConfig['validator']
),
1402326139
);
}
$this->getResult()->merge($validator->validate($value));
}
}
/**
* Check whether at least one configured group does match, if any is configured.
*
* @param array $validatorConfig
* @return bool
*/
protected function doesValidationGroupsMatch(array $validatorConfig): bool
{
return !isset($validatorConfig['options']['validationGroups'])
|| \array_intersect(
$validatorConfig['options']['validationGroups'],
$this->options['validationGroups']
) !== [];
}
/**
* Add validation groups for recursion if necessary.
*
* @param array $validatorConfig
*/
protected function handleValidationGroups(array &$validatorConfig): void
{
if (\in_array($validatorConfig['validator'], ['DigiComp.SettingValidator:Settings', 'DigiComp.SettingValidator:Conditional', 'DigiComp.SettingValidator:Properties', 'Neos.Flow:Collection'])) {
$validatorConfig['options']['validationGroups'] = $this->options['validationGroups'];
} elseif (isset($validatorConfig['options']['validationGroups'])) {
unset($validatorConfig['options']['validationGroups']);
}
}
}

View file

@ -0,0 +1,38 @@
DigiComp\SettingValidator\Tests\Functional\Fixtures\TestObject:
properties:
shouldBeTrue:
BooleanValue:
expectedValue: true
shouldBeFalse:
BooleanValue:
expectedValue: false
Grumble: ~
DigiComp\SettingValidator\Tests\Functional\Fixtures\TestValidationGroupsCustomObject:
self:
DigiComp.SettingValidator:Settings:
name: "GroupValidatorCustom"
DigiComp\SettingValidator\Tests\Functional\Fixtures\TestValidationGroupsDefaultObject:
self:
DigiComp.SettingValidator:Settings:
name: "GroupValidatorDefault"
GroupValidatorDefault:
properties:
shouldBeTrue:
BooleanValue:
expectedValue: true
GroupValidatorCustom:
properties:
shouldBeFalse:
BooleanValue:
expectedValue: false
validationGroups:
- "Custom"
TrueValidator:
self:
BooleanValue:
expectedValue: true

View file

@ -16,4 +16,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE. THE SOFTWARE.

View file

@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
namespace Neos\Flow\Core\Migrations;
/**
* Restructures all Validation.yaml to new format
*/
class Version20170603120900 extends AbstractMigration
{
/**
* @return string
*/
public function getIdentifier(): string
{
return 'DigiComp.SettingValidator-20170603120900';
}
/**
* @inheritDoc
*/
public function up(): void
{
$this->processConfiguration(
'Validation',
function (array &$configuration): void {
foreach ($configuration as $validatorName => &$validators) {
// guard that protects configuration, which has already the new format:
if (isset($validators['properties']) || isset($validators['self'])) {
continue;
}
$newConfiguration = ['properties' => [], 'self' => []];
foreach ($validators as $key => $validator) {
if (!isset($validator['validator']) || !isset($validator['options'])) {
$this->showWarning(
'The Validation.yaml files contained no validator or options for validation: '
. '"' . $validatorName . '.' . $key . '". It was not migrated.'
);
continue;
}
if (isset($validator['property'])) {
$newConfiguration['properties'][$validator['property']][$validator['validator']] =
$validator['options'];
} else {
$newConfiguration['self'][$validator['validator']] = $validator['options'];
}
}
$validators = $newConfiguration;
}
},
true
);
}
}

241
README.md
View file

@ -1,46 +1,211 @@
DigiComp.SettingValidator # DigiComp.SettingValidator
-------------------------
This package allows configuring validators with a new configuration type.
This Package allows to configure Validators for your Action-Arguments or domain model properties to be set by a new ## Introduction
Yaml-File in your Configuration directory.
Lets imagine you had this action-method: This package provides the `SettingsValidator` which uses the configuration type `Validation` to resolve the validators
that should be applied to the value. It distinguishes between validators that are applied to the value itself and its
properties.
/** ## Resolving the validation configuration
* @param Order $order
* @Flow\Validate(type="DigiComp.SettingValidator:Settings")
*/
public function createOrder($order) {...}
Then your Validation.yaml could look like this: The `SettingsValidator` has an option `name`. If it is set, the name is used to resolve the validation configuration,
otherwise the type of the value is used, which is mainly useful for objects where the FQCN is used.
SuperVendor\SuperPackage\Domain\Model\Order: ### Resolving by option `name`
-
property: price
validator: NumberRange
options:
maximum: 20
minimum: 10
-
validator: SuperVendor.SuperPackage:SomeOtherValidator #validates the complete object
options: []
-
property: customer
validator: DigiComp.SettingValidator:Settings
options:
name: OrderCustomer
OrderCustomer:
-
property: firstName
validator: StringLength
options:
minimum: 3
maximum: 20
As you see: Nesting is possible ;) That way you can easily construct flexible structures. To resolve the validation configuration by name just use the option `name`.
The SettingsValidator has an optional option: "name" - If you don't give one, it assumes your validation value is an ```php
object and searches in Validation.yaml for the FQCN. /**
* @Flow\Validate(type="DigiComp.SettingValidator:Settings", options={"name"="MyNamedValidator"})
* @var MyObject
*/
protected MyObject $myObject;
```
The `SettingsValidator` will search for an entry inside the `Validation.yaml` with that name.
```yaml
MyNamedValidator:
...
```
### Resolving by type
To resolve the validation configuration by type just do not set the option `name`.
```php
/**
* @Flow\Validate(type="DigiComp.SettingValidator:Settings")
* @var MyObject
*/
protected MyObject $myObject;
```
The `SettingsValidator` will search for an entry inside the `Validation.yaml` with the FQCN of `MyObject`.
```yaml
My\Package\Domain\Model\MyObject:
...
```
## The validation configuration
### Difference between `self` and `properties`
`self` contains a map of validators that are applied to the value itself. `properties` contains a map with property
names of the value you would like to validate and each entry contains a map of validators that are applied to that
property.
```yaml
MyNamedValidator:
self:
...
properties:
myProperty1:
...
myProperty2:
...
```
### Configuring a validator
To configure a validator you use the type of the validator as key and the options as entries of that key. If the
validator has no options or all the default values are used, set an empty map as options.
```yaml
MyNamedValidator:
self:
'My.Package:SomeValidator':
myOption: "myOptionValue"
properties:
myProperty1:
'My.Package:SomeOtherValidator': {}
myProperty2:
'My.Package:SomeOtherValidator': {}
```
### Disable a validator
To disable a validator you need to set the options to `null`.
```yaml
MyNamedValidator:
self:
'My.Package:SomeValidator': ~
```
## Using the `SettingsValidator`
The `SettingsValidator` can be used to reduce the number of `@Flow\Validate` annotations and gives you the possibility
of overwriting existing validation configurations in other packages.
### Using on properties
Old PHP code:
```php
/**
* @Flow\Validate(type="My.Package:SomeValidator", options={"myOption"="myOptionValue"})
* @Flow\Validate(type="My.Package:SomeOtherValidator")
* @var MyObject
*/
protected MyObject $myObject;
```
New PHP code:
```php
/**
* @Flow\Validate(type="DigiComp.SettingValidator:Settings", options={"name"="MyNamedValidator"})
* @var MyObject
*/
protected MyObject $myObject;
```
New validation configuration:
```yaml
MyNamedValidator:
self:
'My.Package:SomeValidator':
myOption: "myOptionValue"
'My.Package:SomeOtherValidator': {}
```
### Using on actions
Old PHP code:
```php
/**
* @Flow\Validate(argumentName="myObject", type="My.Package:SomeValidator", options={"myOption"="myOptionValue"})
* @Flow\Validate(argumentName="myObject", type="My.Package:SomeOtherValidator")
* @param MyObject $myObject
*/
public function myAction(MyObject $myObject)
{
...
}
```
New PHP code:
```php
/**
* @Flow\Validate(argumentName="myObject", type="DigiComp.SettingValidator:Settings", options={"name"="MyNamedValidator"})
* @param MyObject $myObject
*/
public function myAction(MyObject $myObject)
{
...
}
```
New validation configuration:
```yaml
MyNamedValidator:
self:
'My.Package:SomeValidator':
myOption: "myOptionValue"
'My.Package:SomeOtherValidator': {}
```
### Using inside validator configurations
You can use the `SettingsValidator` inside the validator configuration to easily construct flexible structures.
```yaml
MyNamedValidator:
properties:
myProperty1:
'DigiComp.SettingValidator:Settings':
name: "MyOtherNamedValidator"
MyOtherNamedValidator:
self:
'My.Package:SomeOtherValidator': {}
```
## Providing an empty validator
It can be useful to provide an empty validator in code that is used by many projects. By doing so you can make sure that
a different validation is possible in any project.
```php
/**
* @Flow\Validate(argumentName="myObject", type="DigiComp.SettingValidator:Settings", options={"name"="MyNamedValidator"})
* @param MyObject $myObject
*/
public function myAction(MyObject $myObject)
{
...
}
```
```yaml
MyNamedValidator: {}
```

View file

@ -1,11 +1,11 @@
type: dictionary type: "dictionary"
additionalProperties: additionalProperties:
type: array type: "dictionary"
items: additionalProperties: false
type: dictionary properties:
type: "dictionary"
additionalProperties: false additionalProperties: false
# This validation sadly only hits the first level of validation, and options are not coverable with current validator
properties: properties:
validator: {type: string, required: TRUE} type: "dictionary"
options: {type: dictionary, required: TRUE} self:
property: {type: string, required: FALSE} type: "dictionary"

View file

@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
namespace DigiComp\SettingValidator\Tests\Functional\Fixtures;
use Neos\Flow\Annotations as Flow;
class TestObject
{
/**
* @var bool
*/
protected bool $shouldBeTrue = true;
/**
* @var bool
*/
protected bool $shouldBeFalse = true;
/**
* @Flow\Validate(type="DigiComp.SettingValidator:Settings", options={"name"="TrueValidator"})
* @var bool
*/
protected bool $shouldBeTrueAndValidatedByAnnotation = false;
/**
* @return bool
*/
public function isShouldBeTrue(): bool
{
return $this->shouldBeTrue;
}
/**
* @return bool
*/
public function isShouldBeFalse(): bool
{
return $this->shouldBeFalse;
}
/**
* @return bool
*/
public function isShouldBeTrueAndValidatedByAnnotation(): bool
{
return $this->shouldBeTrueAndValidatedByAnnotation;
}
}

View file

@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace DigiComp\SettingValidator\Tests\Functional\Fixtures;
class TestValidationGroupsCustomObject
{
/**
* @var bool
*/
protected bool $shouldBeTrue = false;
/**
* @var bool
*/
protected bool $shouldBeFalse = true;
/**
* @return bool
*/
public function isShouldBeTrue(): bool
{
return $this->shouldBeTrue;
}
/**
* @return bool
*/
public function isShouldBeFalse(): bool
{
return $this->shouldBeFalse;
}
}

View file

@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace DigiComp\SettingValidator\Tests\Functional\Fixtures;
class TestValidationGroupsDefaultObject
{
/**
* @var bool
*/
protected bool $shouldBeTrue = false;
/**
* @var bool
*/
protected bool $shouldBeFalse = true;
/**
* @return bool
*/
public function isShouldBeTrue(): bool
{
return $this->shouldBeTrue;
}
/**
* @return bool
*/
public function isShouldBeFalse(): bool
{
return $this->shouldBeFalse;
}
}

View file

@ -0,0 +1,79 @@
<?php
declare(strict_types=1);
namespace DigiComp\SettingValidator\Tests\Functional;
use DigiComp\SettingValidator\Tests\Functional\Fixtures\TestObject;
use DigiComp\SettingValidator\Tests\Functional\Fixtures\TestValidationGroupsCustomObject;
use DigiComp\SettingValidator\Tests\Functional\Fixtures\TestValidationGroupsDefaultObject;
use DigiComp\SettingValidator\Validation\Validator\SettingsValidator;
use Neos\Flow\Tests\FunctionalTestCase;
use Neos\Flow\Validation\Exception\InvalidValidationConfigurationException;
use Neos\Flow\Validation\Exception\InvalidValidationOptionsException;
use Neos\Flow\Validation\Exception\NoSuchValidatorException;
use Neos\Flow\Validation\ValidatorResolver;
class SettingsValidatorTest extends FunctionalTestCase
{
/**
* @test
* @throws InvalidValidationOptionsException
*/
public function ifNoNameIsGivenClassNameIsUsed(): void
{
$result = $this->objectManager->get(SettingsValidator::class)->validate(new TestObject());
self::assertTrue($result->hasErrors());
self::assertCount(1, $result->getFlattenedErrors());
self::assertCount(1, $result->forProperty('shouldBeFalse')->getErrors());
}
/**
* @test
* @throws InvalidValidationConfigurationException
* @throws InvalidValidationOptionsException
* @throws NoSuchValidatorException
*/
public function conjunctionValidationWorksAsExpected(): void
{
$result = $this->objectManager
->get(ValidatorResolver::class)
->getBaseValidatorConjunction(TestObject::class)
->validate(new TestObject());
self::assertTrue($result->hasErrors());
self::assertCount(1, $result->getFlattenedErrors());
self::assertCount(1, $result->forProperty('shouldBeTrueAndValidatedByAnnotation')->getErrors());
}
/**
* @test
* @throws InvalidValidationOptionsException
*/
public function defaultValidationGroupWorks(): void
{
$result = $this->objectManager
->get(SettingsValidator::class, ['validationGroups' => ['Default']])
->validate(new TestValidationGroupsDefaultObject());
self::assertTrue($result->hasErrors(), 'No errors for validation group "Default"');
self::assertCount(1, $result->getFlattenedErrors(), 'Got a non expected number of errors for group "Default"');
self::assertCount(1, $result->forProperty('shouldBeTrue')->getErrors(), 'Got no error for property');
}
/**
* @test
* @throws InvalidValidationOptionsException
*/
public function customValidationGroupWorks(): void
{
$result = $this->objectManager
->get(SettingsValidator::class, ['validationGroups' => ['Custom']])
->validate(new TestValidationGroupsCustomObject());
self::assertTrue($result->hasErrors(), 'No errors for validation group "Custom"');
self::assertCount(1, $result->getFlattenedErrors(), 'Got a non expected number of errors for group "Custom"');
self::assertCount(1, $result->forProperty('shouldBeFalse')->getErrors(), 'Got no error for property');
}
}

View file

@ -1,34 +1,55 @@
{ {
"name": "digicomp/settingvalidator", "name": "digicomp/settingvalidator",
"type": "typo3-flow-package", "description": "Just a Neos\\Flow Validator resolving other Validators with Configuration/Validation.yaml",
"description": "Just a TYPO3\\Flow Validator resolving other Validators with Configuration/Validation.yaml", "type": "neos-package",
"keywords": [
"Neos",
"Flow",
"validation"
],
"homepage": "https://github.com/digital-competence/DigiComp.SettingValidator",
"license": "MIT",
"authors": [ "authors": [
{ {
"name": "Ferdinand Kuhl", "name": "Ferdinand Kuhl",
"email": "f.kuhl@digital-competence.de", "email": "f.kuhl@digital-competence.de",
"homepage": "http://www.digital-competence.de", "homepage": "https://www.digital-competence.de",
"role": "Developer" "role": "Developer"
} }
], ],
"license": "MIT",
"homepage": "https://github.com/fcool/DigiComp.SettingValidator",
"keywords": [
"Flow",
"validation"
],
"require": { "require": {
"typo3/flow": "~2.0|~3.0", "php": ">=7.4.0",
"php": ">=5.3.0" "neos/flow": "^6.3.5 || ^7.0 || ^8.0"
},
"require-dev": {
"mikey179/vfsstream": "^1.6.1",
"neos/buildessentials": "^7.0.0",
"phpunit/phpunit": "~8.5",
"vimeo/psalm": "~4.22.0"
}, },
"autoload": { "autoload": {
"psr-0": { "psr-4": {
"DigiComp\\SettingValidator": "Classes" "DigiComp\\SettingValidator\\": "Classes/"
} }
}, },
"autoload-dev": {
"psr-4": {
"DigiComp\\SettingValidator\\Tests\\": "Tests/"
}
},
"config": {
"sort-packages": true,
"platform-check": true
},
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-develop": "3.2.x-dev",
"dev-version/2.x-dev": "2.1.x-dev",
"dev-version/1.x-dev": "1.0.x-dev" "dev-version/1.x-dev": "1.0.x-dev"
}, },
"neos": {
"package-key": "DigiComp.SettingValidator"
},
"applied-flow-migrations": [ "applied-flow-migrations": [
"Inwebs.Basket-201409170938", "Inwebs.Basket-201409170938",
"TYPO3.FLOW3-201201261636", "TYPO3.FLOW3-201201261636",
@ -44,7 +65,26 @@
"TYPO3.Fluid-20141113120800", "TYPO3.Fluid-20141113120800",
"TYPO3.Flow-20141113121400", "TYPO3.Flow-20141113121400",
"TYPO3.Fluid-20141121091700", "TYPO3.Fluid-20141121091700",
"TYPO3.Fluid-20150214130800" "TYPO3.Fluid-20150214130800",
"TYPO3.Flow-20151113161300",
"TYPO3.Flow-20161115140400",
"TYPO3.Flow-20161115140430",
"Neos.Flow-20161124204700",
"Neos.Flow-20161124204701",
"Neos.Flow-20161124224015",
"Neos.Eel-20161124230101",
"Neos.Imagine-20161124231742",
"Neos.Media-20161124233100",
"Neos.Flow-20161125124112",
"Neos.SwiftMailer-20161130105617",
"TYPO3.FluidAdaptor-20161130112935",
"Neos.Media-20161219094126",
"Neos.Flow-20170125103800",
"Neos.Flow-20170127183102",
"DigiComp.SettingValidator-20170603120900",
"Neos.Flow-20180415105700",
"Neos.Flow-20190425144900",
"Neos.Flow-20190515215000"
] ]
} }
} }