@@ -145,6 +145,7 @@ public function execute(array $input) : FilterResponse
145145 self ::assertFiltersIsAnArray ($ filters , $ field );
146146 $ customError = self ::validateCustomError ($ filters , $ field );
147147 $ throwOnError = self ::validateThrowOnError ($ filters , $ field );
148+ $ returnOnNull = self ::validateReturnOnNull ($ filters , $ field );
148149 unset($ filters [FilterOptions::IS_REQUIRED ]);//doesn't matter if required since we have this one
149150 unset($ filters [FilterOptions::DEFAULT_VALUE ]);//doesn't matter if there is a default since we have a value
150151 $ conflicts = self ::extractConflicts ($ filters , $ field , $ conflicts );
@@ -167,6 +168,9 @@ public function execute(array $input) : FilterResponse
167168 try {
168169 $ this ->addUsedInputToFilter ($ uses , $ filteredInput , $ field , $ filter );
169170 $ input = call_user_func_array ($ function , $ filter );
171+ if ($ input === null && $ returnOnNull ) {
172+ break ;
173+ }
170174 } catch (Exception $ exception ) {
171175 if ($ throwOnError ) {
172176 throw $ exception ;
@@ -630,6 +634,24 @@ private static function validateThrowOnError(array &$filters, string $field) : b
630634 return $ throwOnError ;
631635 }
632636
637+ private static function validateReturnOnNull (array &$ filters , string $ field ) : bool
638+ {
639+ if (!array_key_exists (FilterOptions::RETURN_ON_NULL , $ filters )) {
640+ return false ;
641+ }
642+
643+ $ returnOnNull = $ filters [FilterOptions::RETURN_ON_NULL ];
644+ if ($ returnOnNull !== true && $ returnOnNull !== false ) {
645+ throw new InvalidArgumentException (
646+ sprintf (self ::INVALID_BOOLEAN_FILTER_OPTION , FilterOptions::RETURN_ON_NULL , $ field )
647+ );
648+ }
649+
650+ unset($ filters [FilterOptions::RETURN_ON_NULL ]);
651+
652+ return $ returnOnNull ;
653+ }
654+
633655 private static function validateCustomError (array &$ filters , string $ field )
634656 {
635657 $ customError = null ;
0 commit comments