getParameters(); foreach ($parameters as $parameter){ if(!$parameter->getClass()){ $arguments[] = self::mapVariables($parameter->getType(), $valuesArray[Str::snake($parameter->getName())]?? null); continue; } $className = $parameter->getClass()->getName(); if(!in_array($className, [OrderObject::class, StepObject::class, Carbon::class])){ $arguments[] = self::mapClassObjects($className, $valuesArray); } } return $arguments; } /** * @param string $type * @param $value * @return bool|float|int|string */ private function mapVariables(string $type, $value){ if($value === null){ return null; } switch ($type){ case 'float': return (float) $value; break; case 'int': case 'integer': return (int) $value; break; case 'bool': case 'boolean': return (bool) $value; break; default: return (string) $value; } } /** * @param string $class * @param array $valuesArray * @return mixed * @throws \ReflectionException */ private function mapClassObjects(string $class, array $valuesArray){ $reflection = new \ReflectionClass($class); $properties = $reflection->getProperties(); return new $class(...array_map(function ($property) use ($valuesArray) { return $valuesArray[Str::snake($property->getName())] ?? null; }, $properties)); } }