Pour toute classe résultat donné MySchema :: Résultat :: Foo (construit à partir de chargeur de schéma par défaut généré syntaxe qui utilise Moose/MooseX :: nonmoose)modificateurs de méthode Moose sur DBIx :: Class :: modèles de schéma dans les Catalyst
Si j'ajoute une enveloppe de méthode BUILDARGS pour aseptiser les données du constructeur pour une ligne comme ceci:
package MySchema::Result::Foo;
use Moose;
use MooseX::NonMoose;
[etc ..]
around 'BUILDARGS' => sub {
my $orig = shift;
my $class = shift;
delete $_[0]->{not_a_real_column};
return $class->$orig(@_);
};
Il fonctionne en utilisant le schéma directement. Par exemple, les travaux suivants comme prévu: Un nouvel objet de ligne est créé avec real_column => « valeur » et not_a_real_column enlevée avant -> nouvelle est appelée
use MySchema;
my $s = MySchema->connect('dbi:blahblahblah');
$s->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #win
Cependant, lorsque vous utilisez le même schéma via Catalyst :: Modèle :: DBIC :: Schema la commande est différente. La procédure suivante échoue lors de la tentative de création d'un nouvel objet ligne Foo car not_a_real_column n'est pas valide. En d'autres termes, les arguments de new ne sont pas exécutés dans BUILDARGS avant -> new est appelé.
$c->model('MySchemaModel')->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #fails
Chose intéressante, si j'enrouler autour de « nouveau » => sub {} au lieu d'environ « BUILDARGS » => sub {} le comportement est le même dans les deux cas, et fonctionne très bien, mais à ma compréhension Les dogmes de l'orignal ne doivent jamais jouer avec le nouveau.
Quelqu'un veut-il m'aider à comprendre pourquoi c'est le cas, ou s'il y a un meilleur moyen?