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