From 98c2d378702e6dd9ecfc155aec0fde2aba25b4d6 Mon Sep 17 00:00:00 2001 From: User Date: Tue, 23 Apr 2024 05:25:47 +0300 Subject: [PATCH] 20240423#4 --- application/src/Services/AbstractDTO.php | 70 ++++-------------------- 1 file changed, 11 insertions(+), 59 deletions(-) diff --git a/application/src/Services/AbstractDTO.php b/application/src/Services/AbstractDTO.php index 7f3c84d..f317133 100644 --- a/application/src/Services/AbstractDTO.php +++ b/application/src/Services/AbstractDTO.php @@ -3,79 +3,31 @@ namespace Base\Services; use Exception; +use ReflectionClass; abstract class AbstractDTO { /** - * @param array $data - * @return static * @throws Exception */ static function fromArray(array $data) : static { + $class = new ReflectionClass(static::class); $self = new static(); - - $propArray = array_keys(get_class_vars(get_class($self))); - - foreach($propArray as $propName){ - $propNameSnakeCase = strtolower(preg_replace("'([A-Z])'", "_$1", $propName)); - if(method_exists($self, "requireAssert".ucfirst($propName))){ - if(isset($data[$propName])) { - $self->{"requireAssert".ucfirst($propName)}($data[$propName]); - } - elseif(isset($data[$propNameSnakeCase])) { - $self->{"requireAssert".ucfirst($propName)}($data[$propNameSnakeCase]); - } - else{ - throw new DTOException("Отсутствует обязательное значение"); - } - } - } - foreach($data as $key => $item){ + foreach ($class->getProperties() as $property) { try { - $camelCaseKey = str_replace('_', '', ucwords($key, "_")); - if(method_exists($self, "assert".$camelCaseKey)) { - $self->{'assert'.$camelCaseKey}($item); - } elseif(in_array(lcfirst($camelCaseKey), $propArray)) { - $self->{lcfirst($camelCaseKey)} = $item; - } + $propertyNameSnakeCase = strtolower(preg_replace("'([A-Z])'", "_$1", $property->getName())); + // data[propertyName] ?? data[property_name] ?? null + $value = $data[$property->getName()] ?? $data[$propertyNameSnakeCase] ?? null; + // если есть внутренний метод (приоритетная обработка) + if($class->hasMethod('set'.ucfirst($property->getName()))) $self->{'set'.ucfirst($property->getName())}($value); + // прямое присовение по умолчанию + elseif(isset($value)) $self->{$property->getName()} = $value; } catch (\Error $error) { - $errorKey[$key] = $error->getMessage(); + $errorKey[$property->getName()] = $error->getMessage(); } if(!empty($errorKey)) throw new Exception(json_encode(["data"=>$data, "error"=>$errorKey])); } return $self; } - - /** - * @param $value - * @return bool - */ - public function validateInt($value) : bool { - return (is_numeric($value)); - } - - /** - * @param $value - * @return bool - */ - public function validateFloat($value) : bool { - return (is_float((float) $value)); - } - - /** - * @param $value - * @return bool - */ - public function validateBoolean($value) : bool { - return (is_bool($value)); - } - - /** - * @param $value - * @return bool - */ - public function validateEmail($value) : bool { - return (filter_var($value, FILTER_VALIDATE_EMAIL)); - } } \ No newline at end of file