代码之家  ›  专栏  ›  技术社区  ›  Julien

如何在Perl的Class::DBI中重写自动生成的访问器?

  •  1
  • Julien  · 技术社区  · 17 年前

    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 回复  |  直到 16 年前
        1
  •  3
  •   innaM    17 年前

    在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,每次插入时都会调用它。

        2
  •  1
  •   Kristof Provost    17 年前

    insert 。处理数据规范化的最佳方法是覆盖 normalize_column_values() 但曼尼说得对,你的接入器坏了。

    PS CDBI mailing list 仍然活跃,只是没有看到太多帖子。大多数人已经转向 DBIx::Class .