2009-01-31 12 views
1

J'ai suivi l'exemple à http://wiki.class-dbi.com/wiki/Overriding_autogenerated_accessorsComment remplacer les accesseurs générés automatiquement dans Perl's Class :: DBI?

Je souhaite modifier l'URL avant qu'il ne soit inséré dans la base de données:

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(@_); 
} 

Mais il ne fonctionne pas:

my $company = Hosting::Company->insert({ Name => 'Test', Url => 'http://http://url' }); 
print $company->Url, "\n"; 

Spectacles:

http://http://url 

Je souhaite la classe: DBI mailing la liste était encore en vie!

Répondre

3

Dans votre accesseur d'URL, vous vérifiez si un paramètre a été transmis à cette méthode. Mais vous ne passez rien, donc l'accesseur ne fera rien d'autre que d'appeler _Url_accessor(). Vous devriez probablement appeler _Url_accessor d'abord, puis modifier le résultat:

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; 
    } 
} 

Si vous souhaitez modifier l'URL avant qu'il ne soit même dans la base de données, je suppose que vous devez fournir un normalize_column_values ​​dans votre classe et ce sera appelé chaque temps qu'une insertion est faite. Le dépassement d'un accesseur ne change pas insert

+0

Vous voulez expliquer vos downvotes? – innaM

+0

Je pense que vous voulez dire 'return $ self -> _ Url_accessor (@_);' et 'my $ url = $ self -> _ Url_accessor();' – Schwern

+0

J'ai supprimé la liste déroulante. Vous avez raison à propos du remplacement de l'accesseur de l'OP. Je pensais que c'était uniquement dû au problème insert-doesn't-use-accessors. – Schwern

Questions connexes