使用clone

时间:2017-02-24 11:11:39

标签: php laravel immutability

我希望创建一个自定义验证器。但我不想每次都致电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
}

1 个答案:

答案 0 :(得分:0)

clone完全有效,通常用于流畅的语法API中的对象不变性。所以我认为那里没有问题。

我怀疑你会得到一些关于半不可变性的评论,但我个人认为这是你问题的合理解决方案