laravel — PHP псевдо неизменный объект с использованием клона

Я хочу создать собственный валидатор. Но я не хочу звонить 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
}

0

Решение

clone является полностью допустимым и часто используется для неизменности объектов в свободно используемых синтаксических API. Так что я не вижу проблем там.

Я подозреваю, что вы получите некоторые комментарии относительно полуизменяемости, но я лично думаю, что это разумное решение вашей проблемы

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]