나는 원래이 질문에 대한 이 답변을 stackoverflow 에 작성했지만이 질문에도 동일한 대답이 적용된다고 생각합니다.
Mathias Verraes 의 기사에 문제에 대한 기사가 있습니다 . 그는 UI를 제공하는 개념에서 모델의 가치 객체를 분리하는 것에 대해 이야기합니다.
국가를 엔터티 또는 값 개체로 모델링할지 묻는 경우 기사에서 인용 :
국가를 엔터티로 모델링하고 데이터베이스에 저장하는 것은 본질적으로 잘못된 것은 없습니다. 그러나 대부분의 경우 너무 복잡합니다. 국가는 자주 바뀌지 않습니다. 국가의 이름이 바뀌면 사실상 모든 실제적인 목적을 위해 새로운 국가입니다. 국가가 더 이상 존재하지 않으면 국가가 두 국가로 분할되어 있기 때문에 모든 주소를 변경할 수는 없습니다.
그는 다음과 같은 새로운 개념을 도입하기위한 다른 접근법을 제안했습니다 AvailableCountry.
사용 가능한 국가는 데이터베이스의 엔터티, JSON의 레코드 또는 코드의 하드 코드 된 목록 일 수 있습니다. (비즈니스가 UI를 통해 쉽게 액세스 할 수 있는지 여부에 따라 다릅니다.)
<?php
final class Country
{
private $countryCode;
public function __construct($countryCode)
{
$this->countryCode = $countryCode;
}
public function __toString()
{
return $this->countryCode;
}
}
final class AvailableCountry
{
private $country;
private $name;
public function __construct(Country $country, $name)
{
$this->country = $country;
$this->name = $name;
}
/** @return Country */
public function getCountry()
{
return $this->country;
}
public function getName()
{
return $this->name;
}
}
final class AvailableCountryRepository
{
/** @return AvailableCountry[] */
public function findAll()
{
return [
'BE' => new AvailableCountry(new Country('BE'), 'Belgium'),
'FR' => new AvailableCountry(new Country('FR'), 'France'),
//...
];
}
/** @return AvailableCountry */
public function findByCountry(Country $country)
{
return $this->findAll()[(string) $country];
}
}
따라서 조회 테이블을 값 객체와 엔티티로 모델링하는 세 번째 솔루션이있는 것 같습니다.
BTW 는 기사에 대한 몇 가지 진지한 논의 를 위해 의견 섹션을 확인 하십시오.