Как хранить такие объекты?
С некого источника, получаю список контрагентов. Для дальнейшей работы с этими контрагентами, хочу завести сущность Контрагент. Столкнулся с такой, архитектурной проблемой:
Список контрагентов приходят в XML, сами контрагенты имеют сырые данные, т.е., примерно 50 свойств, такого формата:
Статус контрагента: принимает значения 1, 2, 3
Тип контрагента: принимает значения ind, legal
и т.д.
Т.е. значения свойств - это некие ключи, а каким ключам, какие значение соответствуют - описаны в документации (в перечень могут в будущем добавлять какие-то новые ключи, и соответственно должна быть возможность без особых трудностей добавить изменение в код).
Как лучше организовать архитектурно, чтобы с этим можно было гибко работать ? В каким виде хранить значения всех ключей свойств ? Отдельным объектом ? Или в каком-то конфигурационном файле, например yaml ?
Лучше сразу в сущности Контрагента хранить значения, или хранить только ключи, а когда нужны данные, использовать какой-то дополнительный метод, который достает его из конфиг файла ?
Какие варианты есть ?
таких объектов может быть несколько, например, у контрагента есть менеджер, со своими свойствами, соответственно, менеджер - тоже отдельная сущность, которая будет у контрагента.
Как насчет что-то похожее на 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();
Код не проверял - просто для примера.