NAME
Class::DBI::DFV - check that your data is valid using DFV
SYNOPSIS
package My::DBI;
use base 'Class::DBI::DFV';
__PACKAGE__->connection(...);
__PACKAGE__->table(...);
__PACKAGE__->columns( All => qw( id val_unique val_optional ) );
sub dfv_profile {
my $class = shift;
return {
filters => 'trim',
required => [qw/val_unique/],
constraint_methods => { val_unique => qr/^\d+$/ },
};
}
INTRODUCTION
NOTE: this module is still under development - please see the bottom of the pod for how you can help.
Class::DBI::DFV
combines the database abstraction of Class::DBI with the data validation of Data::FormValidator. It allows you to specify a DFV profile that the data must match. This profile is applied when you do an insert
or a set
. If the profile does not match then the normal Class::DBI->_croak
method is called.
METHODS
validate_column_values
Class::DBI::DFV overides the validate_column_values
method to do the actual validating. Once it has validated the data it then calls the parent class' validate_column_values
method. There is no need to call this in your code - it is called by Class::DBI. Be warned though if you decide to override it as well.
dfv_results
eval { My::DBI->create( \%data ) }
|| warn "ERROR: ", Dumper( My::DBI->dfv_results->msgs );
The dfv_results
method gives you access to the last results produced by Data::FormValidator.
dfv_base_profile
sub dfv_base_profile {
return {
filters => 'trim',
msgs => {
format => 'validation error: %s',
constraints => { unique_constraint => 'duplicate' },
},
};
}
You will find that there are many things that you will want to put in all your profiles. If in your parent class you create dfv_base_profile
then the values in this will be combined with the dfv_profile
that you create. As a general rule anything that is specified in the profile will override the values in the base profile.
_get_dfv_profile
This is a private method but as it changes your profile it is documented here. The first thing it does is to combine the dfv_base_profile
and the dfv_profile
.
Having done that it then looks at what columns you have in the database and puts all the ones that are not in the profile's required
list in the optional
list.
Finally it caches the profile to make execution faster. Make sure that you use sub refs if you want something to be executed each time the profile is parsed, eg:
defaults => {
wrong => rand(1000),
right => sub { rand(1000) },
},
The 'wrong' one will always return the same value - as the value is created when the profile is created. The 'right' one will be executed each time that the profile is applied and so will be different each time.
unique_constraint
EXPERIMENTAL - this is a constraint that lets you check that the database does not contain duplicate values. Please see the module Local::Test
in the test suite for usage. The way that this constraint is used may well change.
SEE ALSO
Class::DBI - Simple Database Abstraction
Data::FormValidator - Validates user input (usually from an HTML form) based on input profile.
AUTHOR
Edmund von der Burg - evdb@ecclestoad.co.uk
CONTRIBUTE
If you want to change something is Class::DBI::DFV I would be delighted to help. You can get the latest from http://svn.ecclestoad.co.uk/svn/class-dbi-dfv/trunk/. Anonymous access is read-only but if you have an idea please contact me and I'll create an account for you so you can commit too.