@topuserman

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

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

Список контрагентов приходят в 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();


Код не проверял - просто для примера.
  • Вопрос задан
  • 147 просмотров
Пригласить эксперта
Ответы на вопрос 1
JaxAdam
@JaxAdam
Junior Full-Stack Developer
Если допустить что в каждом xml файле у тебя отдельный файл контрагента то создай класс вроде этого.
class Contragent
{
  public $name;
  public $status;
  public $vozrast;
  
  public function __construct($xmlfile){
      $xml = new SimpleXMLElement($xmlfile);
      $this->name = $xml->name;
      $this->status = $xml->status;
      $this->status = $xml->vozrast;
  }
}

Потом используй как то так.
$firstContragent = new Contragent((<xml_file_контрагента>));
echo $firstContragent->name; // имя
echo $firstContragent->status; // статус
echo $firstContragent->vozrast; // возраст

Как-то так.
Подробнее пример тут
Ответ написан
Ваш ответ на вопрос

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

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