Как переопределить автоматически сгенерированные средства доступа в Perl Class::DBI?
Я последовал примеру на http://wiki.class-dbi.com/wiki/Overriding_autogenerated_accessors
Я хочу изменить URL-адрес до его вставки в базу данных:
package Hosting::Company;
use base 'Class::DBI';
my $class = __PACKAGE__;
$class->table('Companies');
$class->columns(Primary => 'CompanyId');
$class->columns(Others => qw/Name Url Comment/);
sub Url {
my $self = shift;
# modify URL.
if (@_) {
$_[0] = 'aaaaaaaaaaaa';
# return $self->_Url_accessor('aaaaaaaaaaaa'); - doesn't work either
}
# Back to normal Class::DBI
return $self->_Url_accessor(@_);
}
Но это не работает:
my $company = Hosting::Company->insert({ Name => 'Test', Url => 'http://http://url' });
print $company->Url, "\n";
Показывает:
http://http://url
Я бы хотел, чтобы список рассылки Class:DBI был еще жив!
2 ответа
Переопределение метода доступа не меняется insert
, Лучший способ справиться с нормализацией данных - переопределить normalize_column_values()
, Но Манни права, ваш помощник разорен.
PS Список рассылки CDBI все еще активен, просто не видел много сообщений. Большинство перешло на DBIx:: Class.
В вашем URL-средстве доступа вы проверяете, был ли передан параметр этому методу. Но вы ничего не передаете, поэтому средство доступа ничего не сделает, кроме как вызовом _Url_accessor(). Возможно, вам следует сначала вызвать _Url_accessor, а затем изменить результат:
sub Url {
my $self = shift;
# Was there a param passed in?
if ( @_ ) {
# Do you really want to modify it here?
return $self->_Url_accessor(@_);
}
else {
my $url = $self->_Url_accessor();
# mangle result here:
$url = 'aaaaaaaaa';
return $url;
}
}
Если вы хотите изменить URL-адрес еще до того, как он попадет в базу данных, я полагаю, вы должны предоставить normalize_column_values в вашем классе, и он будет вызываться каждый раз, когда выполняется вставка.