我按照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邮件列表还活着!
答案 0 :(得分:3)
在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进入数据库之前更改URL,我猜你必须在你的类中提供normalize_column_values,每次插入时都会调用它。
答案 1 :(得分:1)
覆盖访问者不会更改insert
。处理数据规范化的最佳方法是覆盖normalize_column_values()
。但是Manni是对的,你的访问者被破坏了。
PS CDBI mailing list仍然有效,只是没有多少帖子。大多数人已转到DBIx::Class。