diff --git a/src/Valitron/Validator.php b/src/Valitron/Validator.php index 4496e2d..7c76738 100644 --- a/src/Valitron/Validator.php +++ b/src/Valitron/Validator.php @@ -1085,4 +1085,19 @@ class Validator } } } + + /** + * Replace data on cloned instance + * + * @param array $data + * @param array $fields + * @return Valitron + */ + public function withData($data, $fields = array()) + { + $clone = clone $this; + $clone->reset(); + $clone->_fields = !empty($fields) ? array_intersect_key($data, array_flip($fields)) : $data; + return $clone; + } } diff --git a/tests/Valitron/ValidateTest.php b/tests/Valitron/ValidateTest.php index ac3ffca..459e5c1 100644 --- a/tests/Valitron/ValidateTest.php +++ b/tests/Valitron/ValidateTest.php @@ -1155,7 +1155,20 @@ class ValidateTest extends BaseTestCase $v = new Validator(array()); $v->rule('optional', 'address')->rule('email', 'address'); $this->assertTrue($v->validate()); - } + } + + public function testWithData() + { + $v = new Validator(array()); + $v->rule('required', 'name'); + //validation failed, so must have errors + $this->assertFalse($v->validate()); + $this->assertNotEmpty($v->errors()); + //create copy with different data + $v2 = $v->withData(array('name' => 'Chester Tester')); + $this->assertTrue($v2->validate()); + $this->assertEmpty($v2->errors()); + } } function sampleFunctionCallback($field, $value, array $params) {