Как переопределить автоматически сгенерированные средства доступа в Perl Class :: DBI? - PullRequest
1 голос
/ 31 января 2009

Я последовал примеру на 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 ]

3 голосов
/ 31 января 2009

В вашем 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 ​​в вашем классе, и он будет вызываться каждый раз, когда вставка сделана.

1 голос
/ 31 января 2009

Переопределение метода доступа не меняется insert. Лучший способ справиться с нормализацией данных - переопределить normalize_column_values(). Но Манни права, ваш помощник сломан.

PS Список рассылки CDBI все еще активен, просто не видел много сообщений. Большинство перешло на DBIx :: Class .

...