私は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();
}
}
}
Iが第二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();
}
}
}
いくつかのメソッドと入力または出力(たとえば、メソッド 'value')を入力しなくなりました。 PHPにはジェネリック型がなく、文字列のような値の型を検証する必要があります。私はそれがビジネスルール(私は思うが、私は間違っている可能性があります)ではないので、それを行うには適切な場所であるとは思っていません誰かが私にどのオプションが良かったと教えていいですか?
はたぶん、あなたはhttps://github.com/nicolopignatelli/valueobjectsのクローンである、https://github.com/teneleven/valueobjectsを見てみたいです。 git(作者によって削除された) – localheinz