Lastor
@Lastor
Музыкант. Люблю писать и читать код.

Инициализация полей объекта данными из $_Post. Не стреляю ли я себе в ногу?

Хочу превратитить $_POST в объект класса.
Если я правильно понимаю, то при несовпадении типа данных выполнение будет прекращено, что и требуется.
С чем я могу столкнуться при использовании такой функции?
Можно ли её как-то улучшить|дополнить|сократить?
$Inductor = ($_Post['someData'] ?? false) or die(Api::errorMsg('someMsg'));
$Recipient = new myClass();
$Object = Valid::cloneFromAny($Inductor,  $Recipient);
$Object->runSomeValidation();

class Valid
{
    public string|null $error;

    /**
     * @throws \ReflectionException
     */
    public static function cloneFromAny(array|object $Inductor, object $Recipient): object
    {
        $className = get_class($Recipient);
        $classVars = (object)get_class_vars($className);

        foreach ($Inductor as $k => $v) {
            
            //Убираем поля, которых класс не ожидает
            if (!property_exists($classVars, $k))
                continue;
            if (is_object($v) || is_array($v)) {
                
                //Если предлагаемое значение итерабельное, то решаем что с ним делать
                $typeInClass = (new ReflectionProperty($className, $k))->getType()->getName();
                if ($typeInClass === 'array') {
                    //Массив просто инициализируем
                    $Recipient->$k = $v;
                    continue;
                }
                
                //Если это объект ожидаемого класса, инициализируем рекурсивно
                $Recipient->$k = self::cloneFromAny($v, new $typeInClass());
                continue;
            }
            
            //В простом случае инициализируем.
            // Если тип не приводится, выполнение прекратится с Fatal Error.
            $Recipient->$k = $v;
        }
        return $Recipient;
    }
}
  • Вопрос задан
  • 113 просмотров
Пригласить эксперта
Ответы на вопрос 1
DollyPapper
@DollyPapper
Не уверен, что это то что вам нужно, но посмотрите на эту либу: https://github.com/samdark/hydrator
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы