Validation Approach - Apply rules directly to the data model. This means somehow binding the validation/validators to the data model to allow streamlined validation. Also can be achieved by dynamically applying the rules to the data model, e.g. setValidators, setValidation. ----------------------------------------------------------------------------- Granular Model: (StringValidator, Addressvalidator, ZipcodeValidator) => UserModel firstName => (PersonNameValidator, InvalidCharactersValidator) ----------------------------------------------------------------------------- Aggregate Model: (StringValidator, Addressvalidator, ZipcodeValidator) >- UserValidator => UserModel User => (UserValidator) Try ~ interface Validatable { public function validate($data); } abstract class Validator implements Validatable { public $negate = false; public $required = false; public $messages = array('default' => 'Invalid value'); abstract public function validate($value); } $vm = new ValidatorManager($request); $v = new YValidator; $v->required = true; $v->messages['z_error'] = "Blah blah, Z, blah"; $v->messages['x_error'] = "Blah blah, Z, blah"; $vm->register(array('y_field', 'x_field'), $v); abstract class Model implements Validatable, DomainObject { abstract public function validate($data); } class SomeModel extends Model { public function validate($data) { $vm = new ValidatorManager($data); $v = new YValidator; $v->required = true; $v->messages['z_error'] = "Blah blah, Z, blah"; $v->messages['x_error'] = "Blah blah, X, blah"; $vm->register(array('y_field', 'x_field'), $v); } }