我希望创建一个自定义验证器。但我不想每次都致电new
,因为这会使测试更加困难。我也认为App::make
有点难看。我只想要依赖注入我的自定义验证器并使用它。
我对如何实现这一点的想法是使用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 :(得分:0)
clone
完全有效,通常用于流畅的语法API中的对象不变性。所以我认为那里没有问题。
我怀疑你会得到一些关于半不可变性的评论,但我个人认为这是你问题的合理解决方案