Başlangıçta bu soru için bu cevabı stackoverflow üzerine yazdım , ancak aynı sorunun bu soru için de geçerli olduğunu düşünüyorum.
Mathias Verraes tarafından burada sorununuzu anlatan bir makale var . Modeldeki değer nesnelerini kullanıcı arayüzüne hizmet eden kavramlardan ayırmaktan bahsediyor.
Ülkeleri varlık veya değer nesnesi olarak modellemek isteyip istemediğiniz sorulduğunda makaleden alıntı:
Ülkeleri varlık olarak modellemenin ve onları veritabanında saklamasının özünde yanlış bir şey yoktur. Ancak çoğu durumda, bu aşırı karmaşık şeyler. Ülkeler sık sık değişmiyor. Bir ülkenin adı değiştiğinde, aslında tüm pratik amaçlar için yeni bir ülkedir. Bir gün bir ülke artık mevcut değilse, tüm adresleri değiştiremezsiniz, çünkü muhtemelen ülke iki ülkeye ayrılmıştır.
Yeni bir kavram sunmak için farklı bir yaklaşım önerdi AvailableCountry
:
Bu kullanılabilir ülkeler bir veritabanındaki varlıklar, bir JSON'daki kayıtlar veya hatta kodunuzdaki sabit kodlu bir liste olabilir. (Bu, işletmenin bir kullanıcı arayüzü aracılığıyla bunlara kolay erişim isteyip istemediğine bağlıdır.)
<?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];
}
}
Bu yüzden tabloları değer nesneleri ve varlıkları olarak modellemek olan 3. bir çözüm var gibi görünüyor.
BTW makaleyle ilgili bazı ciddi tartışmalar için yorum bölümünü kontrol ettiğinizden emin olun .