Вобщем вот тоже самое без фабрики и рефлексии. Немного коряво, на коленке писал, но как ты говоришь - прототип. :)
final class Username
{
private $value;
private $checker;
public function __construct(UsernameAlreadyRegisteredCheckerInterface $checker)
{
$this->checker = $checker;
}
public function create(string $username): Username
{
if (empty($this->checker)) {
throw new \LogicException('Низя.');
}
if ('' === trim($username)) {
throw new \InvalidArgumentException();
}
if ($this->checker->checkIfUsernameAlreadyRegistered($username)) {
throw new \InvalidArgumentException();
}
$this->value = $username;
unset($this->checker);
return $this;
}
public function __toString(): string
{
return $this->value;
}
}
$checker = new UsernameAlreadyRegisteredChecker();
$username = new Username($checker);
$username->create('John');
var_dump((string)$username);
Основная фишка, если я правильно понял твою задумку, в том, что имя должно быть валидным объектом. Вроде так и есть.
_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.
Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.
Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.