Объект в массив для генерации полезной нагрузки API - PullRequest
0 голосов
/ 31 мая 2019

Я знаю, что заголовок может быть действительно похож на другие существующие вопросы, но реальная проблема действительно отличается от существующих (по крайней мере, я не могу найти другой похожий).

У меня естьAPI, с которым мне нужно связаться, чтобы создать клиента, в полях для создания нового клиента есть поле Address, и да, поле требует заглавных букв A.Но что все это значит?

Я думал о создании сущностей с открытым методом, чтобы я мог преобразовать их в массив и сгенерировать полезную нагрузку для отправки, что-то вроде этого:

class Customer extends Entity
{
    public $name;
    public $email;
    public $phone;
    public $address;
}

Эта сущность будетбыть легко преобразованным в массив, просто используя (array) или даже get_object_vars, реальная проблема здесь в том, что я хочу, чтобы $address был экземпляром другой сущности с именем Address, например:

class Address extends Entity
{
    public $street;
    public $number;
    public $city;
    public $state;
}

Для этого я реализовал один метод с именем properties, например:

abstract class Entity {
    public function properties(): array
    {
        $convert = function($value) use(&$convert)
        {
            return is_scalar($value) ? $value : array_map($convert, (array) $value);
        };

        return $convert($this);
    }
}

Работает, рекурсивно преобразуется.

Проблема здесь в следующем: вместо Addressв качестве ключа он возвращает address в нижнем регистре (очевидно), потому что он только получает поля.

Мне было интересно, как я могу это сделать?Как я могу установить ключ с первой заглавной буквой, если поле объекта - это объект (другой объект)?

Ожидаемый результат будет примерно таким:

[
    'name' => '...'
    'email' => '...'
    'phone' => '...'
    'Address' => [
        'street' => '...'
        'number' => '...'
        'city' => '...'
        'state' => '...'
    ]
]

Спасибов продвинутом.

1 Ответ

0 голосов
/ 31 мая 2019

Вы можете отменить условие и использовать имя класса в качестве ключа, если значение свойства является экземпляром Entity.

public function properties(): array
{
    $result = [];
    foreach ($this as $key => $value) {
        if ($value instanceof Entity) {
            $result[get_class($value)] = $value->properties();
        } else {
            $result[$key] = $value;
        }
    }
    return $result;
}

Хотя я вижу некоторые потенциальные недостатки в общей идее этого. Например, если сущность человека должна иметь несколько адресов в какой-то момент, это не сработает, потому что второй адрес перезапишет первый. Вы можете просто указать имя свойства, но если это не имя класса, кажется, что на самом деле не имеет значения, было ли оно написано заглавными или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...