1

我按照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 邮件列表还活着!

4

2 回答 2

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 进入数据库之前更改它,我想你必须在你的类中提供一个 normalize_column_values ,每次插入时都会调用它。

于 2009-01-31T09:31:38.057 回答
1

覆盖访问器不会改变insert。处理数据规范化的最佳方法是覆盖normalize_column_values(). 但是 Manni 是对的,你的访问器被破坏了。

PS CDBI 邮件列表仍然有效,只是没有看到太多的帖子。大多数人已经转向DBIx::Class

于 2009-01-31T09:35:52.290 回答