Skip to content

Commit 008b96f

Browse files
committed
Use FilterOptions::RETURN_ON_NULL in Filterer::execute()
1 parent 2371ce0 commit 008b96f

2 files changed

Lines changed: 48 additions & 0 deletions

File tree

src/Filterer.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

tests/FiltererTest.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,12 @@ function (int $input, int $fieldOneValue) : int {
378378
[],
379379
],
380380
],
381+
'returnOnNull filter option' => [
382+
'spec' => ['field' => [FilterOptions::RETURN_ON_NULL => true, ['string', true], ['string']]],
383+
'input' => ['field' => null],
384+
'options' => [],
385+
'result' => [true, ['field' => null], null, []],
386+
],
381387
];
382388
}
383389

@@ -424,6 +430,26 @@ public function executeValidatesThrowsOnError()
424430
$filterer->execute(['id' => 1]);
425431
}
426432

433+
/**
434+
* @test
435+
* @covers ::execute
436+
*/
437+
public function executeValidatesReturnOnNull()
438+
{
439+
$this->expectException(InvalidArgumentException::class);
440+
$this->expectExceptionMessage(
441+
sprintf(Filterer::INVALID_BOOLEAN_FILTER_OPTION, FilterOptions::RETURN_ON_NULL, 'id')
442+
);
443+
$specification = [
444+
'id' => [
445+
FilterOptions::RETURN_ON_NULL => 'abc',
446+
['uint'],
447+
],
448+
];
449+
$filterer = new Filterer($specification);
450+
$filterer->execute(['id' => 1]);
451+
}
452+
427453
/**
428454
* @test
429455
* @covers ::filter

0 commit comments

Comments
 (0)