我在學習用ValueObject編碼。我有關於有VO的抽象實現和子類擴展它的問題。孩子們只會實施給定值的驗證方法(電子郵件,用戶名等)。 我的第一個VO看起來如下線在業務規則,這是在構造函數驗證。ValueObject的抽象
final class Email {
private $email;
public function __construct(string $email)
{
$this->validateEmail($email);
$this->email = $email;
}
public function value() : string
{
return $this->email;
}
private function validateEmail(string $email) : void
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new IncorrectEmailException();
}
}
}
我在寫第二VO我發現了一些圖案,其中不同的是僅驗證規則(方法validate
)。所以我想到了一些抽象類實現模式,並讓孩子細化驗證規則。
abstract class ValueObject {
protected $value;
public function __construct($value)
{
$this->validate($value);
$this->value = $value;
}
public function value()
{
return $value;
}
abstract protected function validate($value) : void;
}
final class Email extends ValueObject {
protected function validate($value) : void
{
if (!is_string($value)) {
throw new \InvalidArgumentException();
}
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new IncorrectEmailException();
}
}
}
我輸入了一些方法和輸入或輸出(例如方法'值')。 PHP沒有泛型類型,我必須像字符串一樣驗證值類型。我不確定它是否適合做這件事,因爲它不是商業規則(我認爲,但我可能是錯的)有人可以告訴我哪種選擇更好,並且與良好實踐兼容嗎?
也許你想看看https://github.com/teneleven/valueobjects,這是https://github.com/nicolopignatelli/valueobjects的克隆。 git(由作者刪除)。 – localheinz