Я хочу создать собственный валидатор. Но я не хочу звонить new
каждый раз, так как это затрудняет тестирование. Я также думаю App::make
немного некрасиво Я просто хочу, чтобы Dependency Inject мой пользовательский валидатор и использовал его.
Мои мысли о том, как этого добиться, используя clone
, Вызов метода validate установил бы свойства клона, а не $ this. Таким образом, версия класса DI остается неизменной. Так же очень легко тестировать / издеваться.
Это подходящий шаблон / я должен просто использовать new
?
Мой пользовательский валидатор
class CustomValidator
{
protected $rules = [
'key' => 'required',
];
protected $errors = [];
public function validate(array $event): CustomValidator
{
$v = Validator::make($event, $this->rules);
if ($v->fails()) {
$copy = clone $this;
$copy->errors = $v->errors()->toArray();
return $copy;
}
return $this;
}
public function hasErrors(): bool
{
return !empty($this->errors);
}
public function getErrors(): array
{
return $this->errors;
}
}
Использование:
foreach ($events as $event) {
// customValidator is immutable. $v is cloned
$v = $this->customValidator->validate($event);
if ($v->hasErrors()) {
// do something with $v->errors();
continue;
}
// No errors... Do something else
}
clone
является полностью допустимым и часто используется для неизменности объектов в свободно используемых синтаксических API. Так что я не вижу проблем там.
Я подозреваю, что вы получите некоторые комментарии относительно полуизменяемости, но я лично думаю, что это разумное решение вашей проблемы
Других решений пока нет …