9

对于任何给定的结果类 MySchema::Result::Foo(由使用 Moose/MooseX::nonmoose 的默认模式加载器生成的语法构建)

如果我添加一个 BUILDARGS 方法包装器来清理一行的构造函数数据,如下所示:

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

它在直接使用模式时有效。例如,以下内容按预期工作:使用 real_column=>'value' 创建新行对象,并在调用 ->new 之前删除 not_a_real_column

use MySchema;
my $s = MySchema->connect('dbi:blahblahblah');
$s->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #win

但是,当通过 Catalyst::Model::DBIC::Schema 使用相同的模式时,顺序是不同的。尝试创建新的 Foo 行对象时以下失败,因为 not_a_real_column 无效。换句话说, new 的参数在调用 ->new 之前不会通过 BUILDARGS 运行。

$c->model('MySchemaModel')->resultset('Foo')->new({ real_column=>'value', not_a_real_column=>'some other thing' }); #fails

有趣的是,如果我环绕 'new' => sub{} 而不是 'BUILDARGS' => sub{} 两种情况下的行为是相同的,并且工作正常,但据我了解 Moose 教条状态永远不会混淆新的。

任何人都愿意帮助我理解为什么会这样,或者是否有更好的方法?

4

1 回答 1

1

我明白了,您正在使用 MooseX::NonMoose。

鉴于此,我猜您需要使用 FOREIGNBUILDARGS

around 'FOREGINBUILDARGS' => sub {
   my $orig = shift;
   my $class = shift;
   delete $_[0]->{not_a_real_column};
   return $class->$orig(@_);
};

“MooseX::NonMoose 允许您通过定义 FOREIGNBUILDARGS 方法来操作传递给超类构造函数的参数列表。”
http://metacpan.org/pod/MooseX::NonMoose

我真的希望这对你有用!

于 2011-12-09T18:03:04.573 回答