Но хочется что бы в нем еще и валидация хранимого значения происходила.
На сколько корректно с точки зрения архитектуры прокидывать валидатор в контсрукторе VO?
Так:
Код: Выделить всё
class SomeVO
{
public function __construct(string $value, callable $validator)
{
$validator($value);
}
}
class SomeValidator
{
public static function validate ($value) : void
{
if ($value !== 'test') {
throw new InvalidArgumentException('Invalid value.');
}
}
}
$vo1 = new SomeVO('test', 'SomeValidator::validate');
$vo2 = new SomeVO('test', function ($value){
if ($value !== 'test') {
throw new InvalidArgumentException('Invalid value');
}
});
Код: Выделить всё
interface VOValidator {
public function validate($value) : bool;
}
class TestValidator implements VOValidator
{
public function validate($value) : bool
{
return ($value === 'test');
}
}
class SomeVO
{
public function __construct(string $value, VOValidator $validator)
{
if (!$validator->validate($value)) {
throw new InvalidArgumentException('Invalid value');
}
}
}
$vo1 = new SomeVO('test', new TestValidator);
$vo2 = new SomeVO('test1', new TestValidator);