Как хранить такие объекты?

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

Список контрагентов приходят в XML, сами контрагенты имеют сырые данные, т.е., примерно 50 свойств, такого формата:

Статус контрагента:  принимает значения 1, 2, 3
Тип контрагента:  принимает значения ind, legal
и т.д.

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

  1. Как лучше организовать архитектурно, чтобы с этим можно было гибко работать ? В каким виде хранить значения всех ключей свойств ? Отдельным объектом ? Или в каком-то конфигурационном файле, например yaml ?

  2. Лучше сразу в сущности Контрагента хранить значения, или хранить только ключи, а когда нужны данные, использовать какой-то дополнительный метод, который достает его из конфиг файла ?

  3. Какие варианты есть ?

таких объектов может быть несколько, например, у контрагента есть менеджер, со своими свойствами, соответственно, менеджер - тоже отдельная сущность, которая будет у контрагента.

Как насчет что-то похожее на ValueObject ?

abstract class DataValue {

  private $values = [];
  private $code;

  public function __construct(string $code) {
    $this->code = $code;
    $this->values = $this->getCodeValues();
  }

  public function getValue() {
    return $this->values[$this->code] ?? null;
  }

  public function getCode(): string {
    return $this->code;
  }

  abstract public function getCodeValues(): array;

}

class CounterpartyStatus extends DataValue {
  public function getCodeValues(): array {
    return [
      "ind" => "Индивидуальный предприниматель",
      "le" => "Юр. лицо"
    ];
  }
}

class Counterparty {

  private $status;

  public function __construct(string $statusCode) {
    $this->status = new CounterpartyStatus($statusCode);
  }

  public function getStatus(): DataValue {
    return $this->status;
  }

}

$counterparty = new Counterparty("le");
$counterparty->getStatus()->getValue();

Код не проверял - просто для примера.


Ответы (0 шт):