@@ -25,8 +25,30 @@ final class Validation
2525 * Creates a callable chain of constraints.
2626 *
2727 * @param Constraint|ValidatorInterface|null $constraintOrValidator
28+ *
29+ * @return callable($value)
2830 */
2931 public static function createCallable ($ constraintOrValidator = null , Constraint ...$ constraints ): callable
32+ {
33+ $ validator = self ::createIsValidCallable ($ constraintOrValidator , ...$ constraints );
34+
35+ return static function ($ value ) use ($ validator ) {
36+ if (!$ validator ($ value , $ violations )) {
37+ throw new ValidationFailedException ($ value , $ violations );
38+ }
39+
40+ return $ value ;
41+ };
42+ }
43+
44+ /**
45+ * Creates a callable that returns true/false instead of throwing validation exceptions.
46+ *
47+ * @param Constraint|ValidatorInterface|null $constraintOrValidator
48+ *
49+ * @return callable($value, &$violations = null): bool
50+ */
51+ public static function createIsValidCallable ($ constraintOrValidator = null , Constraint ...$ constraints ): callable
3052 {
3153 $ validator = $ constraintOrValidator ;
3254
@@ -39,13 +61,10 @@ public static function createCallable($constraintOrValidator = null, Constraint
3961
4062 $ validator = $ validator ?? self ::createValidator ();
4163
42- return static function ($ value ) use ($ constraints , $ validator ) {
64+ return static function ($ value, & $ violations = null ) use ($ constraints , $ validator ) {
4365 $ violations = $ validator ->validate ($ value , $ constraints );
44- if (0 !== $ violations ->count ()) {
45- throw new ValidationFailedException ($ value , $ violations );
46- }
4766
48- return $ value ;
67+ return 0 === $ violations -> count () ;
4968 };
5069 }
5170
0 commit comments