Modelo: Validación automática
Las clases del modelo persistente (las que extienden PersistentObject) aceptan la definición de restricciones sobre sus atributos y relaciones. Estas restricciones sirven luego para verificar automáticamente que los datos con los que se quiere crear una instancia de una clase son inválidos. Estas verificaciones contra las restricciones son invocadas al invocar a alguno de los siguientes métodos de PersistentObject:- PersistentObject :: validate(): boolean
Solamente valida los datos de los valores de los campos de la clase contra las restricciones definidas en la clase para cada campo. Retorna true si no hubieron errores de validación, false en caso contrario. - PersistentObject :: save(): boolean
Intenta guardar en la base de datos los datos de la instancia actual, detectando automáticamente si se debe hacer un INSERT o un UPDATE en la base de datos. Antes de guardan datos invoca al método validate(), y retorna true si validaron todos los datos y se pudieron guardar, false si algún dato no valida (en este caso no guarda nada en la base de datos).
- PersistentObject :: getErrors(): array<string, array<string>>
retorna por cada campo, un array con todos los errores generados para ese campo. - PersistentObject :: getFieldErrors( attr: string ): array
retorna los errores generados para un campo específico. - PersistentObject :: hasErrors(): boolean
retorna true si existen errores de validación, false en caso contrario. Obviamente debe invocarse luego de validar los datos, para poder ver si existen errores.
Un ejemplo de definición de restricciones podría ser:
$this->addConstraints("nombre", array(
Constraint::minLength(1),
Constraint::maxLength(30),
Constraint::blank(false)
));
$this->addConstraints("edad", array(
Constraint::between(10,100)
));
$this->addConstraints("email", array(
Constraint::email()
));
Constraint::minLength(1),
Constraint::maxLength(30),
Constraint::blank(false)
));
$this->addConstraints("edad", array(
Constraint::between(10,100)
));
$this->addConstraints("email", array(
Constraint::email()
));
En el primer caso, el atributo nombre es de tipo TEXT, para este tipo de dato se pueden definir restricciones:
- minLength: restricción de tamaño mínimo para el string.
- maxLength: restricción de tamaño máximo para el string.
- blank: restricción que define si el string puede ser vacío o no.
- inList: restricción que define un conjunto de opciones posibles para el valor del atributo.
El segundo atributo, edad, es un número al cual se puede
definir la restricción between que indica que el valor
del atributo debe estar entre los valores especificados.
El atributo email, es un string que debe tener el formato
válido de un email, por lo tanto se utiliza la restricción email para
validar su formato.
Nota: la restricción maxLength para atributos
de texto determina el tipo de la columna respectiva en la base de datos,
por ejemplo, si se utiliza un maxLength de 100, la columna
tendrá tipo VARCHAR(100), si se utiliza el valor 1000,
la columna tendrá tipo TEXT.
Cuidado con las restricciones sobre atributos de una superclase
No se pueden declarar restricciones sobre atributos de una superclase si estos no fueron declarados antes,
o sea que es necesario inicializar la superclase antes de definir restricciones sobre sus atributos.
Ver ticket #22.
