From 013d570eb78496993864f50bd0fe24136dd64d9d Mon Sep 17 00:00:00 2001 From: whwyy Date: Mon, 4 Dec 2023 22:15:18 +0800 Subject: [PATCH] eee --- src/Validator/BindForm.php | 1 + src/Validator/Validator.php | 34 +++++++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/Validator/BindForm.php b/src/Validator/BindForm.php index 47f5da3..1ca67ce 100644 --- a/src/Validator/BindForm.php +++ b/src/Validator/BindForm.php @@ -46,6 +46,7 @@ class BindForm implements InjectParameterInterface $validator->addRule($property->getName(), $rule); } } + $validator->setTypes($property->getName(), $property->getType()); if (!$property->hasDefaultValue()) { $this->insertDefaultValue($property->getType(), $object, $property->getName()); } diff --git a/src/Validator/Validator.php b/src/Validator/Validator.php index 22967e0..3b6e114 100644 --- a/src/Validator/Validator.php +++ b/src/Validator/Validator.php @@ -9,6 +9,8 @@ use Kiri\Router\Interface\ValidatorInterface; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ServerRequestInterface; use ReflectionException; +use ReflectionNamedType; +use ReflectionUnionType; /** @@ -36,6 +38,12 @@ class Validator protected object $formData; + /** + * @var array + */ + protected array $types = []; + + /** * @param object $formData * @return object @@ -47,6 +55,17 @@ class Validator } + /** + * @param string $property + * @param ReflectionNamedType|ReflectionUnionType $types + * @return void + */ + public function setTypes(string $property, ReflectionNamedType|ReflectionUnionType $types): void + { + $this->types[$property] = $types; + } + + /** * @return object */ @@ -81,10 +100,9 @@ class Validator return false; } $params = !$request->getIsPost() ? $request->getQueryParams() : $request->getParsedBody(); - $method = Kiri::getDi()->getReflectionClass($this->formData::class); foreach ($params as $name => $value) { - if (!$method->hasProperty($name)) { + if (!isset($this->types[$name])) { continue; } $rules = $this->rules[$name] ?? []; @@ -94,9 +112,11 @@ class Validator return $this->addError($name); } } - $property = $method->getProperty($name); - if ($property->getType() instanceof \ReflectionUnionType) { - foreach ($property->getType()->getTypes() as $type) { + + /** @var ReflectionNamedType|ReflectionUnionType $property */ + $property = $this->types[$name]; + if ($property instanceof ReflectionUnionType) { + foreach ($property->getTypes() as $type) { $typeName = $type->getName(); if ($typeName == 'string' && is_string($value)) { $this->formData->{$name} = $value; @@ -119,10 +139,10 @@ class Validator throw new \Exception('Fail type value.'); } } else { - $value = match ($property->getType()?->getName()) { + $value = match ($property->getName()) { 'int' => (int)$value, 'float' => (float)$value, - 'bool' => $value == 'true', + 'bool' => $value == 'true', default => $value }; }