diff --git a/docs/en/index.md b/docs/en/index.md index 84f434b..1bec3b2 100644 --- a/docs/en/index.md +++ b/docs/en/index.md @@ -45,6 +45,9 @@ final class ItemFilterResolver extends AbstractFilterResolver 'price' => function (Range $range) { return $this->priceResolver($range); }, + 'brand(?:\[(.+)\])?\.id' => function (string $value, array $matches) { // resolver will match key "brand.id" or e.g. "brand[xyz].id" (value "xyz" will be passed via $matches property) + return $this->brandResolver($value); + }, ]; } @@ -89,6 +92,12 @@ final class ItemFilterResolver extends AbstractFilterResolver return $condition; } + + private function brandResolver(string $value, array $matches): string + { + $subKey = $matches[1][0] ?? 'default'; + return "brand_${subKey} = '${value}'"; + } } ``` diff --git a/src/Generator/SQL/Resolver/AbstractFilterResolver.php b/src/Generator/SQL/Resolver/AbstractFilterResolver.php index 650af41..7061533 100644 --- a/src/Generator/SQL/Resolver/AbstractFilterResolver.php +++ b/src/Generator/SQL/Resolver/AbstractFilterResolver.php @@ -8,16 +8,23 @@ abstract class AbstractFilterResolver { /** - * @param mixed $value + * @param array $values */ - public function resolve(string $column, $value): string + public function resolve(string $column, ...$values): string { $mapping = $this->getResolvers(); - if (! isset($mapping[$column])) { - throw new InvalidArgumentException('Missing filter for "' . $column . '"'); + foreach ($mapping as $pattern => $resolver) { + $matches = []; + if ((bool) preg_match_all("#^${pattern}$#", $column, $matches) === false) { + continue; + } + + array_push($values, $matches); + + return call_user_func_array($resolver, $values); } - return call_user_func($mapping[$column], $value); + throw new InvalidArgumentException($column); }